class Solution:
def strStr(self, haystack: str, needle: str) -> int:
# 基本情况
if len(haystack) == 0 or len(needle) == 0:
return -1
if len(haystack) == 1 and len(needle) == 1:
if haystack != needle:
return -1
else:
return 0
if len(needle) == 1:
for i in range(len(haystack)):
if haystack[i] == needle:
return i
return -1
# 动态规划生成next数组
def generateNext(needle):
next_arr = [-1 for i in range(len(needle))]
next_arr[1] = 0
for i in range(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 + 1
else:
next_arr[i] = 0
return next_arr
next_arr = generateNext(needle)
# 匹配代码,i为haystack的指针,j为needle(pattern)的指针
i = 0
j = 0
while i + len(needle) - j <= len(haystack):
if haystack[i] == needle[j]:
i += 1
j += 1
else:
# 暴力法这里的i不是减next_arr[j]回退,而是减整个patter长度回退。kmp
# 在这里做文章
i = i - next_arr[j]
j = 0
if j == len(needle):
return i - len(needle)
return -1
leetcode 28. 找出字符串中第一个匹配项的下标
最新推荐文章于 2026-01-05 22:36:07 发布
文章介绍了如何使用KMP算法实现Python中的字符串查找函数strStr,包括基本情况判断、动态规划生成next数组以及匹配过程。重点在于处理字符串匹配时的回退策略。
262

被折叠的 条评论
为什么被折叠?



