next 数组记录的就是最长相同前后缀的集合。
如果 next[len - 1] != 0,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。
next数组中最长相等前后缀的长度为:next[len - 1] 。
数组长度为:len。
如果len % (len - (next[len - 1])) == 0 ,则说明 (数组长度-最长相等前后缀的长度) 正好可以被 数组的长度整除,说明有该字符串有重复的子字符串。
「强烈建议大家把next数组打印出来,看看next数组里的规律,有助于理解KMP算法」
class Solution {
public:
void getNext(int* next,string& s){
int j=0;
next[0]=j;
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);
if(next[s.size()-1]!=0){//说明字符串有最长相同的前后缀
int block=s.size()-next[s.size()-1];
if(s.size()%block==0) return true;
}
return false;
}
};