目录
主要是想起到一个记录的作用
一、学习视频
【最浅显易懂的 KMP 算法讲解】 https://www.bilibili.com/video/BV1AY4y157yL/?share_source=copy_web&vd_source=dc0e55cfae3b304619670a78444fd795
二、跟练代码
代码来自视频
# KMP算法
def build_next(patt):
# 计算next数组
# 是关于子串的,输入子串
next = [0] # 注意初始化,第一个肯定为0
prefix_len = 0 # 当前 共同前后缀的长度
n = len(patt)
i = 1
while i < n:
# 匹配
if patt[prefix_len] == patt[i]:
prefix_len += 1
next.append(prefix_len)
i += 1
# 不匹配
else:
if prefix_len == 0:
next.append(0)
i += 1
else:
# 查看已匹配中是否存在更短的前后缀
# 找到前一位置的next值,跳转,i不变
prefix_len = next[prefix_len - 1]
return next
def kmp_search(string, patt):
next = build_next(patt)
i, string_len = 0, len(string) # 主串
j, patt_len = 0, len(patt) # 子串
while i < string_len:
if string[i] == patt[j]:
i += 1
j += 1
elif j > 0:
j = next[j - 1]
else:
i += 1
if j == patt_len:
return i - j # 返回起始位置
完
感谢你看到这里!一起加油吧!