java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846
本题的高效解法,需要使用KMP算法中,NEXT数组的处理逻辑
KMP算法https://blog.csdn.net/grd_java/article/details/136107363
以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 ;
}
}