class Solution:
def get_next(self,_next , s):
# i,j j是前缀,i是后缀,两种情况
_next[0] = 0
j = 0
for i in range(1,len(s)):
while s[i]!=s[j] and j >0:
j=_next[j-1]
if s[i]==s[j]:
j+=1
_next[i]=j
return _next
def strStr(self, haystack: str, needle: str) -> int:
if len(needle) == 0:
return -1
_next = [0]*len(needle)
_next =self.get_next(_next,needle)
j=0
for i in range(len(haystack)):
while j > 0 and haystack[i] != needle[j]:
j = _next[j - 1]
if haystack[i] == needle[j]:
j += 1
if j == len(needle):
return i - len(needle) + 1
return -1
28. 找出字符串中第一个匹配项的下标 用kmp算法专门解决父字符串中是否包含子字符串问题,首先获得next数组,这是子字符串的前缀表,每个位置是以该位置为止的子字符串前缀(从首字母开始到该位置结束)的最大相等前后缀,每个位置的最大相等前后缀用i,j双指针来求,i遍历子字符串是后缀的结尾,j是前缀的结尾,对于每个当前位置,都用i和j分成了前后缀,同时j也是最大相等前后缀的长度,如果s[i]和s[j]相同就i,j一起加,不同的话就找j-1位置的前缀表下标看是否相同
另外strStr函数在得到next表之后,i遍历父串,j遍历子串,j遍历完就结束,相等时一起加一,不等时while找前一个的next数组对应的下标
class Solution:
def get_next(self,_next,s):
_next[0]=0
j=0
for i in range(1,len(_next)):
while j>0 and s[i] !=s[j]:
j=_next[j-1]
if s[i] == s[j]:
j+=1
_next[i]=j
return _next
def repeatedSubstringPattern(self, s: str) -> bool:
if len(s) ==0:
return False
_next = [0] * len(s)
_next=self.get_next(_next,s)
if _next[-1]!=0 and len(s) % (len(s)-_next[-1]) ==0:
return True
else:
return False
459. 重复的子字符串 主要不好想到长度-最长相等前后缀长度(next数组最后一个值) = 重复的长度,用整体长度/重复的长度看是否有余数