编程语言
首页 > 编程语言> > 459. 重复的子字符串(KMP算法)

459. 重复的子字符串(KMP算法)

作者:互联网

459. 重复的子字符串

image-20210920114930823

优秀解法:KMP(n,n)

class Solution {
public:
    bool kmp(const string& s){
        int n = s.size();
        //将fail定义为最长相同前后缀长度 - 1  
        vector<int> fail(n,-1);
        for(int i = 1; i < n; i++){
            int now = fail[i - 1];
            //如果初始值是-1 那么这里是now + 1 如果是0 这里是now 下面的赋值同理
            while(now != -1 && s[now + 1] != s[i]){
                //如果始终不同 那么始终缩短为a串的最长相同子前缀直到now为-1或者相同了
                now = fail[now];
            }
            //前一个fail值的下一位和当前位相同的话 当前fail为前fail+1
            if(s[now + 1] == s[i]) fail[i] = now + 1;
        } 
        //第一个条件:只有当原串有相同前后缀才有可能符合题意
        //第二个条件:规律:最长规律字串长度 = n - 最长前后缀 成倍数 
        return fail[n - 1] != -1 && n % (n - fail[n - 1] - 1) == 0;        
    }

    bool repeatedSubstringPattern(string s) {
        return kmp(s);
    }

    
};

参考资料:知乎KMP回答

标签:459,相同,后缀,算法,KMP,fail,长度,now,最长
来源: https://blog.csdn.net/Rush6666/article/details/120389968