给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
- 输入: "abab"
- 输出: True
- 解释: 可由子字符串 "ab" 重复两次构成。
示例 2:
- 输入: "aba"
- 输出: False
示例 3:
- 输入: "abcabcabcabc"
- 输出: True
- 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
解法:KMP算法
如果一个字符串可以由重复子串构成,那么这个子串 是 它的最长相等前后缀 不包含的部分
例子:ababab,最长相等前后缀是abab,不包含ab,那么重复子串(如果有的话)是ab。
证明过程:
代码:
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
if len(s) == 0:
return False
nxt = [0] * len(s)
self.getNext(nxt,s)
if nxt[-1] != 0 and len(s) % (len(s)-nxt[-1]) == 0:
return True
return False
def getNext(self, nxt, s):
nxt[0] = 0
j = 0
for i in range(1, len(s)):
while j>0 and s[i] != s[j]:
j=nxt[j-1]
if s[i] == s[j]:
j += 1
nxt[i] = j
return nxt
总结:
这道题思路比较巧妙。
KMP算法还需要多看,多联系,去熟练。