思路:题目寻找的是一个字符串可否由某个部分重复构成,意思就是我将这些一个个小部分重新排布仍然等于原字符串,那么第一个思路就出来了
我一次挪动一个字符,将其挪到最后一位,若该字符串符合题意,则总有那么一个时候,挪动的字符串构成了题意中的某个部分,那么此时的字符串就等于原来的字符串
如图,该字符串由ABCD这个部分重复组成,意思就是我们将ABCD这个部分随意排序,那都等于原来字符串,上面的操作就是将第一个ABCD部分挪到最后一个ABCD处,那么怎么才能挪动呢,不管你这个部分是ABCD,ABCDEASDHNIOJOI....我一个一个字符挪动,总有能到达的那一刻(前提是该字符串符合题意),当挪动的个数为length-1时,还不相等,那么就说明这个字符串不符合题意了
优化:我们可以直接将两个字符串拼接在一起(代替之前挪很多次),那么现在这个问题就转化为,凭借之后的字符串(去头去尾)是否存在子串为原字符串(KMP算法)
思路就讲到这,代码实现也有,但我想重写一份KMP的,今天整理了KMP两个小时,还是没怎么搞明白,等搞明白了再发吧(不是故意拖的)
实现代码(java)
class Solution {
public boolean repeatedSubstringPattern(String s) {
return (s + s).substring(1,(s+s).length()-1).contains(s);
}
}