方法一:采用kmp算法,获得next数组。并且next数组的最后一个元素代表的长度一定是s.length()-next[-1]的整数倍。
class Solution {
public boolean repeatedSubstringPattern(String s) {
int[] kmp = getnext(s);
int len = s.length();
return (kmp[len]!=0) && (kmp[len]%(len-kmp[len])==0);
}
public int[] getnext(String s){
if(s.length()==1){
return new int[]{-1,0};
}
int[] next = new int[s.length()+1];
next[0] = -1;
next[1] = 0;
int cn = 0;//最长前缀的长度
int i = 2;
while(i<next.length){
if(s.charAt(i-1)==s.charAt(cn)){
next[i++] = ++cn;
}else if(cn>0){
cn = next[cn];
}else{
next[i++] = 0;
}
}
return next;
}
}
方法二:
直勾勾的想
class Solution {
public boolean repeatedSubstringPattern(String s) {
int n = s.length();
for(int i=n/2;i>=1;i--){
int c = 0;
String sb = "";
if(n%i==0){
c = n/i;
}
for(int j=0;j<c;j++){
sb += s.substring(0,i);
}
if(s.equals(sb)){
return true;
}
}
return false;
}
}
来源:CSDN
作者:爱打篮球的憨憨
链接:https://blog.csdn.net/xiaobailaji/article/details/104629016