参考了459. 重复的子字符串:【KMP经典问题】关于利用next[j]数组寻找重复子字符串的方法。
重复子字符串满足的两个条件:
1、如果存在循环重复的子串,则第一个(也可理解为其中任意某一个)循环周期的子串长度一定能被整个串的长度整除。
s.length()%(s.length()-(next[s.size()-1]+1))==0
2、把普通的next[j]数组最后拓展一位,如果存在重复的子字符串,根据next[j]数组的实际意义,则显然有
next[s.size()]>next[s.size()-1]
完整代码:
class Solution {
public:
void GetIndex(int* next,string s){
int j=-1,i=0;
next[0]=-1;
while (i<s.size()){ //拓展了一位所以不是通常的i<s.size()-1
if(j==-1||s[i]==s[j]){
i++,j++;
next[i]=j;
}
else
j=next[j];
}
}
bool repeatedSubstringPattern(string s) {
if(s.size()==0||s.size()==1) return false;
int next[s.size()+1]; //拓展一位以做判断
GetIndex(next,s);
if(next[s.size()]>next[s.size()-1]&&s.length()%(s.length()-(next[s.size()-1]+1))==0)
return true;
else
return false;
}
};
结果:
欢迎交流。