题目:
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
思路:
若对称分为两只情况:
循环了奇数次:QWQWQW
循环了偶数次:QWQWQWQW
长度减去最后一个元素的next值始终是一个周期。
可得公式: len - (next[len - 1] 始终是一个周期,若对称那么肯定可以取余。
若不对称:
设a为部分对称长度,x为中间不对称长度。
QWASDQW
x = 3;
a = 2;
len%( len - (next[len - 1] ) = (2a+x) % (a+x)
推理可知(2a+x) % (a+x) != 0;
所以区分是否重复循环用 : len - (next[len - 1]
代码:
class Solution {
public:
void getNext (int* next, const 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) {
if (s.size() == 0) {
return false;
}
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;
}
};