leetcode459_重复的子字符串


1、题目

2、分析

  按照官方的分析,可以按照其特点,验证是否存在整除的周期,然后对该周期进行逐个验证,但是这样复杂度为O(n^2)。

      另外一种方法是两个s字符串拼接起来,这样s字符串一定是它的一个子字符串。

      另外一个办法是,获得KMP算法的next数组,这样根据多个重复字符串的特点,进行一个规律的验证,如果满足这样的规律,那么我们就认为它是一个含有多个重复字符串的长字符串。

3、代码

   KMP代码如下

   其实KMP的这种思路很好,我之前一直模模糊糊的觉得有这种思路,但是不知道如何实现,现在基本上了解了一点点。

class Solution {
public:
    void getNext (int* next, const string& s){
        next[0] = -1;
        int j = -1;
        for(int i = 1;i < s.size(); i++){
            while(j >= 0 && s[i] != s[j+1]) {
                j = next[j];
            }
            if(s[i] == s[j+1]) {
                j++;
            }
            next[i] = j;
        }
    }
    bool repeatedSubstringPattern(string s) {
        if (s.size() == 0) {
            return false;
        }
        int next[s.size()];
        getNext(next, s);
        int len = s.size();
        if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0) {
            return true;
        }
        return false;
    }
};