classSolution:defstrStr(self, haystack:str, needle:str)->int:ifnot needle:return0
i =0
j =0while i <len(haystack):while i <len(haystack)and haystack[i]!= needle[j]:
i +=1
tmp = i
while i <len(haystack)and j <len(needle)and haystack[i]== needle[j]:
i +=1
j +=1if j ==len(needle):return tmp
else:
i = tmp +1
j =0return-1
classSolution:defstrStr(self, haystack:str, needle:str)->int:
a =len(needle)
b =len(haystack)if a ==0:# 空串返回0return0next= self.getnext(a, needle)# 创建next数组
p =-1# 指向模式串的指针for j inrange(b):while p >=0and needle[p+1]!=haystack[j]:# 和主串不匹配时,连续回退
p =next[p]if needle[p+1]== haystack[j]:# 和主串匹配时,模式串指针前移
p +=1if p == a-1:# 匹配成功return j-a+1return-1# 主串遍历完但是没有找到"""
构造next数组只需要关注模式串
需要完成3个任务:
1.next数组初始化
2.前缀和后缀匹配处理
3.前缀和后缀不匹配处理
"""defgetnext(self, a, needle):next=[''for i inrange(a)]# 创建next数组空间
k =-1# next初始化,0号用-1进行初始化next[0]= k # k直线最长公共前后缀中的前缀末尾,同时表示公共字符串的长度for i inrange(1,len(needle)):# i指向的是公共最长前后缀中后缀的末尾,因为前后缀要比较,所以i的初始值为1while(k>-1and needle[k+1]!=needle[i]):# 当前缀和后缀不匹配时,前缀末尾k应该回到next[k],这个是循环的回退
k =next[k]if needle[k+1]== needle[i]:# 前缀和后缀相等的时候
k +=1# 公共前缀的长度+1next[i]= k # i的回退最终确定就是kreturnnext
28. 实现 strStr()1.题目2.我的解决方案不出我所料,超时了class Solution: def strStr(self, haystack: str, needle: str) -> int: if not needle: return 0 i = 0 j = 0 while i < len(haystack): while i