本题的高效解法,需要使用KMP算法中,NEXT数组的处理逻辑
- 以
abcabcabc
abc为例对应NEXT数组为[0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
] - 可见最长公共前后缀为
abcabcabc
.我们发现,如果是通过固定子串重复若干次组成的字符串,减去最长公共前后缀后,剩下的就是这个重复若干次的固定子串 - 所以我们可以利用KMP算法中的NEXT数组,获取整个字符串的最长公共前后缀长度。
- 对于这个例子就可以得到最长公共前后缀长度为9. 而整个字符串长度len = 12. 12-9 = 3. 3就是固定重复子串abc的长度。
- 如果整个字符串都可以被abc这个固定重复子串整除,那么就说明这个字符串一定是满足题意的。
- 也就是len % (len - next[len-1]) == 0的话,就满足题意。简单来说就是len - next[len-1]是固定重复子串abc的长度。len是整个字符串的长度。如果len可以被abc这个固定重复子串整除,那么就满足题意。
class Solution {
public boolean repeatedSubstringPattern(String s) {
if (s.equals("")) return false;
int len = s.length();
char[] chars = s.toCharArray();
int[] next = new int[len];
for (int i = 1, j = 0; i < len; i++) {
while (j > 0 && chars[i] != chars[j]) j = next[j-1];
if (chars[i] == chars[j]) j++;
next[i] = j;
}
if (next[len-1] > 0 && len % (len - next[len-1]) == 0) return true;
else return false;
}
}