算法记录 | Day8字符串KMP算法
KMP算法
公共前后缀比较好理解,代码随想录里的这篇讲的很清楚了,可以点击跳转看动画演示,但是如何求next数组呢?
虽然也有动画吧,但咱还是不理解,所以只有抠代码了。
题解中比较好理解的是if needle[k+1] == needle[i] 的情况,这种情况下只需要k不断向前加一就可以了,但当遇到不等的情况,具体操作是什么就分析不清了,以下是debug的视频,对于我来讲,这样会清晰看到k值和next数组的变化,再自己动手画一画会理解很多。
emm该视频只能本地播放,之后有视频床再放吧
LeetCode 28-实现strStr()
题目描述:给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
def strStr(self, haystack: str, needle: str) -> int:
# 求next数组
def getNext(s):
l = len(s)
next_s = [' ' for i in range(l)]
k = -1
next_s[0] = k
for i in range(1, len(s)):
while(k>-1 and s[k+1]!=s[i]):
k = next_s[k]
if s[k+1] == s[i]:
k += 1
next_s[i] = k
return next_s
解题思路
- 用上刚学的kmp数组
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
# 求next数组
def getNext(s):
l = len(s)
next_s = [' ' for i in range(l)]
k = -1
next_s[0] = k
for i in range(1, len(s)):
while(k>-1 and s[k+1]!=s[i]):
k = next_s[k]
if s[k+1] == s[i]:
k += 1
next_s[i] = k
return next_s
# 找下标
a=len(needle)
b=len(haystack)
if a==0:
return 0
next_s=getNext(needle)
p=-1
for j in range(b):
while p>=0 and needle[p+1]!=haystack[j]:
p=next_s[p]
if needle[p+1]==haystack[j]:
p+=1
if p==a-1:
return j-a+1
return -1
难点
emmm本身就难,明天再看吧。