Leetcode 字符串轮转 KMP

解题思路


题面
两倍s1变成字符串匹配,用KMP。
KMP预先处理模式串(短串)的\(next[]\)数组,\(next[]\)的意思为自我匹配一样的值的下一个的位置。
复杂度\(O(n)\)

代码

class Solution {
public:
    bool isFlipedString(string s1, string s2) {

        int len1=s1.length(),len2=s2.length();
        if(len1!=len2) return 0;
        string s3=s1+s1;

        int nxt[100001];
        nxt[0]=-1;nxt[1]=0;
        int len3=s3.length();
        for(int i=2,j=0;i<len2;i++){
            if(s2[i-1]==s2[j]) nxt[i]=++j;
            else if(j>0) j=nxt[j];
                 else nxt[i]=0;
        }
        int i,j;
        for(i=0,j=0;i<len3 && j<len2;){
            if(s3[i]==s2[j]) i++,j++;
            else if(j!=0) j=nxt[j];
                 else i++;
        }
        return j==len2 ? 1 : 0;
    }
};
posted @ 2022-09-29 20:20  ChrisKKK  阅读(35)  评论(0编辑  收藏  举报