面试题 01.09. 字符串轮转

题目链接:leetcode.

我又要开始暴力了,字符串长度在[0, 100000]范围内的话O(n^2)应该能过
时间O(n^2) 空间 O(n)

/*
执行用时:48 ms, 在所有 C++ 提交中击败了8.40%的用户
内存消耗:334.2 MB, 在所有 C++ 提交中击败了5.04%的用户
*/
class Solution {
    
    
public:
    bool isFlipedString(string s1, string s2) {
    
    
        int M = s1.size(), N = s2.size();
		if(M != N)
			return false;
		int i = 0;
		while(i < M && s1.substr(i, M - i) != s2.substr(0, M - i))
		{
    
    
			i++;
		} 
		//不必判断下面这个,否则两个空字符串就返回false了 
        // if(i == M)
        //     return false;
		return s1.substr(0, i) == s2.substr(M - i, i); 
    }
};

其实有更简便的方法,就是判断s3 = s1 + s1 里是否包含s2
O(n^2) O(n)

/*
执行用时:4 ms, 在所有 C++ 提交中击败了91.01%的用户
内存消耗:7.8 MB, 在所有 C++ 提交中击败了50.10%的用户
*/
class Solution {
    
    
public:
    bool isFlipedString(string s1, string s2) {
    
    
        int M = s1.size(), N = s2.size();
		if(M != N)
			return false;
		string s3 = s1 + s1;
		return s3.find(s2) != string::npos; //注意,没找到会返回string::npos 
    }
};

差不多得了,有个KMP的算法时间复杂度更低但我,,,懒得看了啊啊啊啊
下次一定இ௰இ

猜你喜欢

转载自blog.csdn.net/pppppppyl/article/details/114988508