题目:
给一个非空的字符串!
abcabc
返回true
asdfa
返回false
class Solution {
public:
void getNext(int* next,string& s){
int j = -1;
next[0] = j;
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 ){//没啥用,题目说>0的字符串
return false;
}
int next[s.size()];
getNext(next,s);
int len = s.size();
//如果next[len - 1]!= -1 就说明字符串有相同的前后缀了。
//如果len %(len - (next[len - 1] + 1)) == 0
//说明(数组长度 - 最长相等前后字符串的长度)正好可以被数组的长度整除,说明改字符串有重复的子字符串!!!
if(next[len - 1] != -1 && len %(len - (next[len - 1] + 1)) == 0){
return true;
}
return false;
}
};
next不减一的情况
class Solution {
public:
void getNext(int* next,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();
if(next[len - 1] != 0 && len %(len - (next[len - 1] )) == 0){
return true;
}
return false;
}
};