题目
https://leetcode-cn.com/problems/repeated-substring-pattern/
思路-KMP
求出next数组
用一个小例子来说明next数组代码为什么这么写
用next数组求解
- 如果 next[len - 1] != 0,则说明字符串有最长相同的前后缀(
- 最长相等前后缀的长度为:next[len - 1]
- 如果len % (len - next[len - 1] ) == 0 ,则说明 (数组长度-最长相等前后缀的长度) 正好可以被 数组的长度整除,说明有该字符串有重复的子字符串。
public boolean repeatedSubstringPattern(String s) {
if (s.equals("")) {return false;}
int len = s.length();
char[] chars = s.toCharArray();
//next数组的构建,与昨日一样
int[] next = new int[len];
int j = 0;
next[0] = 0;
for (int i = 1; i < s.length(); i++) {
while(j > 0 && chars[i]!=chars[j]){ j = next[j-1]; }
if (chars[i]==chars[j]){ j++;}
next[i] = j;
}
//开始利用next数组进行判断
if (next[len-1] > 0 && len % (len - next[len-1]) == 0) { return true; }
return false;
}