题目
解法
- 解析:如果next[len] > 0 ,代表这个字符串有相同的开头和结尾,但怎么判断是否时重复字符串构成呢?
- 假设一个被重复构成的字符串,它的最小构成单元长度是x,所以它的长度应该为m*x也就是mx;
- 它的最大重复单元就应该是几个x合在一起,不会存在.5x的情况,因为如果一半的x也可以,呢最小重复单元就应该是0.5x,所以最大的重复单元也应该是几个x合在一起,有相同的开头和结尾,nx;
- 呢么mx-nx剩下的应该是什么呢?我们知道肯定剩下的是x,但是是几个x呢?肯定是1个;
- 因为如果剩大于等于2的x,呢么最长的重复单元就应该是nx+x,所以肯定只剩1个
- 所以被重复构成的字符串,应该满足len % (len - next[len]) == 0,即mx%(mx-nx) == 0,同理
mx/(mx-nx) == m
class Solution {
public boolean repeatedSubstringPattern(String s) {
char[] cs = s.toCharArray();
int len = cs.length;
int[] next = new int[len + 1];
int i = 0;
int j = -1;
next[0] = -1;
while(i < len){
if(j == -1 || cs[i] == cs[j]){
i++;
j++;
next[i] = j;
}else{
j = next[j];
}
}
if(next[len] > 0 && len % (len - next[len]) == 0){
return true;
}else{
return false;
}
}
}