假设一个字符串,是由一个重复的子串组成的,那么它的最长相等前后缀必然与整个字符串的必然相差了一个重复子串的长度。
假设整个字符串的长度为len
,那么next[len - 1] + 1
就是最长相等前后缀的长度,且len % (len - next[len - 1] + 1) == 0
class Solution {
public:
void getNext(int *next, const string &s) {
int j = -1;
next[0] = j;
for (int i = 1; i < s.size(); i++) {
// next[j + 1]指向匹配好的前缀的下一个字符
// 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) {
// string s2 = s + s;
int next[s.size()];
int len = s.size();
int count = 0;
getNext(next, s);
//还要判断是否有最长相等前后缀
if (next[len - 1] != -1 && len % (len - next[len - 1] - 1) == 0)
return true;
else
return false;
}
};
标签:子串,459,int,pattern,len,next,substring,后缀,size
From: https://www.cnblogs.com/zwyyy456/p/16589685.html