求模板串的最长前缀后缀公共串
def compute_lps_array(pattern: str, lps: list):
"""
计算lps数组,即对应字符串的最长前缀和最长后缀的长度
"""
j = 0
lps[0] = 0
for i in range(1, len(pattern)):
if pattern[i] == pattern[j]:
j += 1
lps[i] = j
else:
j = 0
lps[i] = 0
求模板串在text中的索引
def kmp_search(text: str, pattern: str) -> int:
"""
使用KMP算法在文本中查找模式字符串的位置
"""
lps = [0] * len(pattern)
compute_lps_array(pattern, lps)
print(lps)
i = 0
j = 0
while i < len(text):
print(text[i],pattern[j])
if text[i] == pattern[j]:
i += 1
j += 1
elif j > 0:
j = lps[j - 1]
else:
i += 1
if j == len(pattern):
return i - j
return -1
kmp算法链接:
算法数据结构——字符串匹配算法KMP精讲及python实现