インタビューの質問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); 
    }
};

実際、O(n ^ 2)O(n)s3 = s1 + s1がに含まれているかどうかを判断するより簡単な方法がありますs2

/*
执行用时: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