classSolution:defstrStr(self, haystack:str, needle:str)->int:# 基本情况iflen(haystack)==0orlen(needle)==0:return-1iflen(haystack)==1andlen(needle)==1:if haystack != needle:return-1else:return0iflen(needle)==1:for i inrange(len(haystack)):if haystack[i]== needle:return i
return-1# 动态规划生成next数组 defgenerateNext(needle):
next_arr =[-1for i inrange(len(needle))]
next_arr[1]=0for i inrange(2,len(next_arr)):
k = next_arr[i-1]while needle[i-1]!= needle[k]and k !=0:
k = next_arr[k]if needle[i-1]== needle[k]:
next_arr[i]= k +1else:
next_arr[i]=0return next_arr
next_arr = generateNext(needle)# 匹配代码,i为haystack的指针,j为needle(pattern)的指针
i =0
j =0while i +len(needle)- j <=len(haystack):if haystack[i]== needle[j]:
i +=1
j +=1else:# 暴力法这里的i不是减next_arr[j]回退,而是减整个patter长度回退。kmp# 在这里做文章
i = i - next_arr[j]
j =0if j ==len(needle):return i -len(needle)return-1