459.重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。
示例 2:
输入: "aba"
输出: False
示例 3:
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
思路
https://www.programmercarl.com/0459.重复的子字符串.html#思路
具体的思路可以看代码随想录,讲解的很清晰。(暴力法、移动匹配法、KMP法)
暴力法
python
# 解法一:暴力法
class Solution(object):
def repeatedSubstringPattern(self, s):
"""
:type s: str
:rtype: bool
"""
n = len(s)
if n <= 1:
return False # 因为题目说的是由一个子串重复多次构成
substr = ""
for i in range(1, n//2+1): # 因为重复子串构成的前后半部分肯定一样
if n % i == 0:
substr = s[:i]
if substr * (n//i) == s:
return True
return False
KMP法
python
# 解法二:KMP法
class Solution(object):
def repeatedSubstringPattern(self, s):
"""
:type s: str
:rtype: bool
"""
if len(s) == 0:
return False
next = [0]*len(s) # 对next数组初始化
self.getNext(next, s)
# 需要判断 next数组最后一个元素是否是-1
if next[len(s)-1] != -1 and len(s) % (len(s) - (next[len(s)-1]+1)) == 0:
return True
return False
def getNext(self, next, s):
# 求next数组
j = -1
next[0] = -1
for i in range(1, len(s)):
while j >=0 and s[i] != s[j+1]:
j = next[j]
if s[i] == s[j+1]:
j += 1
next[i] = j