题目:重复的子字符串
学习资料:代码随想录
初始思路
- 暴力求解,满足长度可以是当前子串的整数倍;遍历验证子串可以重复构成
- n%i == 0;其中i就是代表子串长度
- 要所有的j都满足,s[j] == s[j-i]
学习后
- KMP算法,要能想到,这个最短重复的子串其实就是,最长相等前后缀不包含的那部分。(前缀或后缀不包含的那部分)
- 那么就是先求出next数组,其中数组的最后一个值,就是可以代表这个串最长相等前后缀的长度。那么利用这个来判断。
- 满足条件的情况是:首先最长相等长度不能为0,为0就说明不存在相等,那就不可能重复。其次是n必须是最短子串的整数倍
实现过程
- 注意kmp实现过程,还需消化
#思路一
n = len(s)
for i in range(1, n//2+1):
if n % i == 0:
for j in range(i, n):
if s[j] != s[j-i]:
temp = 0
break
else:
temp = 1
if temp == 1:
return True
return False
#思路二
def repeatedSubstringPattern(self, s: str) -> bool:
n = len(s)
nxt = self.getNext(s, n)
#最小重复串的长度就是总长度减去最长相等前后缀的长度
re = n - nxt[-1]
if nxt[-1] != 0 and n % re == 0 :
return True
return False
#KMP
def getNext(self, s, n):
j = 0
next_ = [0] * n
for i in range(1, n):
while j > 0 and s[j] != s[i]:
j = next_[j-1]
if s[j] == s[i]:
j += 1
next_[i] = j
return next_