一:题目
二:上码
class Solution {
public:
/**
思路:
a b c a b c a b c a b c
next[i] 0 0 0 1 2 3 4 5 6 7 8 9
i 0 1 2 3 4 5 6 7 8 9 10 11
length:12
next[length-1]:next[11] = 9
length - next[length-1] = 3;//求出我们的单个字符串
如果length % (length - next[length-1]) == 0 那么的话 我们就可以确定我们有多少个字符串。
*/
//求出前缀表
void getIndex(int *next,string s) {
int j = 0;//前缀表的末尾
next[0] = 0;//只有一个字符的
for (int i = 1; i < s.size(); i++) {//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()];
getIndex(next,s);
int length = s.size();
//保证我们的包含最后一个元素的子串是有最长公共前后缀的
//
if ( next[length-1] != 0 && length % (length - next[length-1]) == 0) {
return true;
}
return false;
}
};