给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。
示例 2:
输入: s = "aba"
输出: false
示例 3:
输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
提示:
-
1 <= s.length <= 104
-
s 由小写英文字母组成
前缀表统一减一的代码实现:
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){
return false;
}
int next[s.size()];
int len=s.size();
getNext(next,s);
if(next[len-1]!=-1&&len%(len-(next[len-1]+1))==0){
return true;
}
return false;
}
};
前缀表(不减一)的代码实现:
class Solution {
public:
void getNode(int* next,string& s){
int j=0;
next[0]=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()];
int len=s.size();
getNode(next,s);
if(next[len-1]!=0 && len%(len-(next[len-1]))==0){
return true;
}
return false;
}
};