给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
//如果 s 是重复字符串,两个s拼在一起,在中间部分肯定还可以找到s
public static boolean repeatedSubstringPattern(String s) {
//拼接
StringBuilder builder = new StringBuilder(s + s);
//删除收尾,避免找到原来的两个s
builder.deleteCharAt(2*s.length()-1);
builder.deleteCharAt(0);
//寻找
return builder.indexOf(s) != -1;
}
//KMP算法
//构造前缀表(当前位置最长公共前后缀大小组成的数组)
//前缀表中为零的部分就是一个重复串
//当前字符串由多个重复串构成,那么字符串长度可以整除重复串长度
public static boolean repeatedSubstringPattern1(String s) {
int[] next = new int[s.length()];
int j=0;
for (int i = 1; i < s.length(); i++) {
while (j>0&&s.charAt(j)!=s.charAt(i)){
j=next[j-1];
}
if (s.charAt(j)==s.charAt(i)){
j++;
}
next[i]=j;
}
return next[s.length() - 1] > 0 && s.length() % (s.length() - next[s.length() - 1]) == 0;
}