题目要求:给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
思路:
一、首先对于暴力解法,可以枚举所有的字串进行判断。但是枚举时实际上只需要一次for循环遍历终止位置(每次一定从头开始),而不需要一个for循环获取起始位置,一个for循环获取终止位置,而且不用遍历到结束,字串结束位置大于中间位置一定不能组成重复字符串。
二、移动匹配方法。如果一个字符串s内部由重复的子串组成,那么两个s组成的新字符串中如果中间还能出现一个s,则说明时重复子串组成。但是两个s拼接后我们要删除此字符串的首首尾字符,这样能确保搜索出的s一定是拼接出来的。(代码中find库函数实现为O(m+n))
三、KMP算法。在由重复子串组成的字符串中,最长相等前后缀不包含的子串就是最小重复子串!!!(此处可以自己画图验证)
leetcode实战:
代码实现: