题目描述:
标签:字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
代码:
思路分析:部分匹配值表求解思路同strStr()题的思路。
这题主要是把语言表达转换为数学思路。当next[len-1]!=0且len % (len - next[len-1])==0时说明能够有子串重复多次构成,这是由部分匹配值表的性质决定的!
其余情况下返回false。
class Solution {
public boolean repeatedSubstringPattern(String s) {
if(s.length() == 0){
return false;
}
int len = s.length();
int[] next = kmpNext(s);
if(next[len - 1] != 0 && len % (len - next[len - 1]) == 0){
return true;
}
return false;
}
public int[] kmpNext(String s){
int[] next = new int[s.length()];
next[0] = 0;
for(int i = 1,j = 0;i < s.length();i++){
while(j > 0 && s.charAt(i) != s.charAt(j)){
j = next[j - 1];
}
if(s.charAt(i) == s.charAt(j)){
j++;
}
next[i] = j;
}
return next;
}
}