帮我写一个kmp字符串匹配算法 并且每一行注释
时间: 2023-07-20 19:44:27 浏览: 104
好的,以下是 KMP 字符串匹配算法的 Python 实现,并且每一行都有注释:
```python
def kmp_match(s, p):
"""
KMP 字符串匹配算法
:param s: 主串
:param p: 模式串
:return: 匹配到的第一个位置,如果没有匹配到返回 -1
"""
m, n = len(s), len(p)
# 生成 next 数组
next = get_next(p)
i, j = 0, 0
while i < m and j < n:
# 如果 j = -1,或者当前字符匹配成功(即 s[i] == p[j]),都令 i++, j++
if j == -1 or s[i] == p[j]:
i += 1
j += 1
else:
# 如果 j != -1,且当前字符匹配失败(即 s[i] != p[j]),则令 i 不变,j = next[j]
# next[j] 即为 j 所对应的 next 值
j = next[j]
if j == n:
# 如果匹配成功,返回匹配子串的起始坐标
return i - j
else:
# 如果匹配失败,返回 -1
return -1
def get_next(p):
"""
生成模式串的 next 数组
:param p: 模式串
:return: next 数组
"""
n = len(p)
next = [-1] * n
i, j = 0, -1
while i < n - 1:
if j == -1 or p[i] == p[j]:
i += 1
j += 1
# next[i] = j 表示 next 数组中 i+1 的值(下标从 0 开始)为 j
next[i] = j
else:
# 如果字符不相同,那么 j 为 next[j] 的值
j = next[j]
return next
```
希望对您有帮助!
阅读全文