详解KMP算法以及Python如何实现
KMP算法是一种字符串匹配算法,它的全称是Knuth-Morris-Pratt算法,是由Donald Knuth、Vaughan Pratt和James H. Morris位计算科学家于1977年联合发明的。KMP算法的主要思想是利用已知信息来避免无效的字符比较从而提高字符串匹配的效率。本文将详细讲解KMP算法的原理实现过程,并提供两个示例说明。
KMP算法原理
KMP算法的核心思想是利用已知信息来避免无效的字符比较。具体来说,MP算通过预处理模式串(即待匹配的字符串)的信息,建一个跳转表(也称为部分匹配表),然后利用跳表来指导匹配过程。跳转表的构建过程是通过模式串本身的信息来完成的,因此可以避免无效的字符比较,而提高匹配效率。
KMP算法实现
在Python中,可以使用以下代码实现KMP算法:
def kmp_search(text, pattern):
n, m = len(text), len(pattern)
if m == 0:
return 0
next = get_next(pattern)
j = 0
for i in range(n):
while j > 0 and text[i] != pattern[j]:
j = next[j - 1]
if text[i] == pattern[j]:
j += 1
if j == m:
return i - m + 1
return -1
def get_next(pattern):
m = len(pattern)
next = [0] * m
j = 0
for i in range(1, m):
while j > 0 and pattern[i] != pattern[j]:
j = next[j - 1]
if pattern[i] == pattern[j]:
j += 1
next[i] = j
return next
其中,text表示文本串,pattern表示模式串。执行上述代码后,可以得到模式串在文本串中的起始位置,如果模式串不存在,则返回-1。
示例1
假设需要在一个字符串中查找目标子串。可以使用上述代码实现KMP算法。具体代码如下:
text = "ABABDABACDABABCAB"
pattern = "ABABCABAB"
index = kmp_search(text, pattern)
if index != -1:
print("目标子串在文本串中的起始位置为:", index)
else:
print("目标子串不存在")
输出结果如下:
目标子串在文本串中的起始位置为: 10
示例2
假设需要在一个整数数组中查找目子数组。可以使用上述代码实现KMP算法。具体代码如下:
text = [1, 2, 3, 4, 5, 6, 7, 8, 9]
pattern = [4, 5, 6]
index = kmp_search(text, pattern)
if index != -1:
print("目标子数组在文本数组中的起始位置为:", index)
else:
print("目标子数组不存在")
输出结果如下:
目标子数组在文本数组中的起始位置为: 3
总结
KMP算法是一种高效字符串匹配算法,它的实现过程比较复杂。在Python中使用简单的代码实现KMP算法,通过示例说明可以好地理解这个算法的实现过程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解KMP算法以及python如何实现 - Python技术站