力扣459.给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成

思路:

用28题kmp算法的思路,如果最长相等前后缀不为0,且总长度能够整除最长相等前后缀所不包含的部分则为符号题意的解答

代码:

class Solution {
public:
void getnext(int *next,string s){
        int j=0;
        next[0]=0;
        for(int i=1;i0&&s[i]!=s[j]){
                j--;
                j=next[j];
            }
            if(s[i]==s[j]){
                j++;
            }
            next[i]=j;
        }
    }
    bool repeatedSubstringPattern(string s) {
        int next[s.size()];
        getnext(next,s);
        //上面跟28题解法一样
        if(s.size()==0){
            return false;
        }
        if(next[s.size()-1]!=0&&s.size()%(s.size()-next[s.size()-1])==0){
            //如果最长相等前后缀不为0,且总长度能够整除最长相等前后缀所不包含的部分则为符号题意的解答
            return true;
        }
        return false;
    }
};

你可能感兴趣的:(算法,c++,数据结构)