讲解链接:28. 找出字符串中第一个匹配项的下标
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
a=len(needle)
b=len(haystack)
if a==0:
return 0
next=self.getnext(a,needle)
p=-1
for j in range(b):
while p>=0 and needle[p+1]!=haystack[j]:
p=next[p]
if needle[p+1]==haystack[j]:
p+=1
if p==a-1:
return j-a+1
return -1
def getnext(self,a,needle):
next=['' for i in range(a)]
k=-1
next[0]=k
for i in range(1,len(needle)):
while (k>-1 and needle[k+1]!=needle[i]):
k=next[k]
if needle[k+1]==needle[i]:
k+=1
next[i]=k
return next
讲解链接:459.重复的子字符串
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
n = len(s)
if n == 0:
return False
next = self.getNext(s)
if next[-1] != 0 and n % (n - next[-1]) == 0:
return True
return False
def getNext(self, s):
n = len(s)
next = [0] * n
next[0] = 0
j = 0
for i in range(1, n):
while j > 0 and s[i] != s[j]:
j = next[j - 1]
if s[i] == s[j]:
j += 1
next[i] = j
return next