[leetcode] 字符串 重复的子字符串

题目:
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

代码:
思路1 (暴力算法):省略
思路2 (移动匹配):
两个重复的字符串,肯定能组成一个新的s

代码
 bool repeatedSubstringPattern(string s) {
        string s1 = s + s;
        s1.erase(s1.begin());
        s1.erase(s1.begin()+(s1.size()-1));
        if( s1.find(s) == std::string::npos ) return false;
        return true;
 }
思路3 (KMP算法): 通过next数组特性去解决该问题。最大前缀 == 最大后缀,如果是重复字符串组成的。取余的话,是0;
点击查看代码
class Solution {
public:
    void getNext (int* next, const string& s){
        next[0] = 0;
        int j = 0;
        for(int i = 1;i < s.size(); i++){
            while(j > 0 && s[i] != s[j]) {
                j = next[j-1];
            }
            if(s[i] == s[j]) {
                j++;
            }
            next[i] = j;
        }
    }
   bool repeatedSubstringPattern(string s) {
        int next[s.size()];
        getNext(next, s);
        int  len = s.size();
        for(int i = 0 ; i< len ;i++) cout << next[i]  << " ";
        if(next[len - 1] != 0 && len % (len - next[len-1]) == 0 ) return true;
        return false;
   }
};

posted @ 2024-07-17 22:00  写代码的兰  阅读(48)  评论(0)    收藏  举报