📅  最后修改于: 2023-12-03 15:11:17.557000             🧑  作者: Mango
KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,它是由 Donald Knuth、Vaughan Pratt、James H. Morris于1977年联合发明的。该算法可以在O(n+m)的时间复杂度内完成模式串在文本串中的匹配搜索。
KMP算法的核心思想是利用已匹配的字符信息,尽可能减少无效的匹配次数。在匹配出现不匹配的情况时,算法会根据已匹配的字符信息,尽量少地向右移动模式串,使得出现不匹配的位置重新对齐。
下面是一个用于模式搜索的KMP算法的Python程序:
def kmp(text, pattern):
if not text or not pattern:
return -1
if len(pattern) > len(text):
return -1
# 构建Next表
next_arr = [0] * len(pattern)
j, i = 0, 1
while i < len(pattern):
if pattern[i] == pattern[j]:
j += 1
next_arr[i] = j
i += 1
elif j > 0:
j = next_arr[j-1]
else:
next_arr[i] = 0
i += 1
# 利用Next表查找匹配
i, j = 0, 0
while i < len(text) and j < len(pattern):
if text[i] == pattern[j]:
i += 1
j += 1
elif j > 0:
j = next_arr[j-1]
else:
i += 1
# 没有找到匹配
if j == len(pattern):
return i - j
else:
return -1
该函数名为 kmp
,接收两个参数:text
为文本串,pattern
为模式串。
返回值说明:
如果匹配成功,返回第一个匹配的位置,如果匹配失败,返回 -1。
代码实现过程包括两部分:
在这一步中,利用类似动态规划的思想,从模式串首尾两端开始比较。如果首尾字符相同,则将两端的指针往后移动,并将Next表中对应位置赋值为当前已匹配的字符数。
如果首尾字符不相同,就需要回溯到已匹配字符数目更小的位置重新匹配,这个位置就是Next表给出的位置。如果该位置上的字符与当前字符相同,则继续向后匹配,否则就需要继续回溯到更小的位置。
在完成Next表的构建后,就可以利用该表在文本串中查找匹配。每一次比较中,先比较文本串中的一个字符是否与模式串中的字符匹配,如果匹配就继续向后匹配下一个字符。
如果不匹配,就需要回溯到Next表给出的位置重新匹配。
本文介绍了用于模式搜索的KMP算法的Python程序实现,该算法可以高效地解决字符串匹配问题。代码实现过程比较简单,但是要理解算法的核心思想并掌握Next表的构建方法。