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; } };
纵一苇之所如,临万顷之茫然。