📜  用于模式搜索的 KMP 算法的Python程序(1)

📅  最后修改于: 2023-12-03 15:11:17.557000             🧑  作者: Mango

用于模式搜索的 KMP 算法的Python程序
算法简介

KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,它是由 Donald Knuth、Vaughan Pratt、James H. Morris于1977年联合发明的。该算法可以在O(n+m)的时间复杂度内完成模式串在文本串中的匹配搜索。

KMP算法的核心思想是利用已匹配的字符信息,尽可能减少无效的匹配次数。在匹配出现不匹配的情况时,算法会根据已匹配的字符信息,尽量少地向右移动模式串,使得出现不匹配的位置重新对齐。

Python代码实现

下面是一个用于模式搜索的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。

代码解析

代码实现过程包括两部分:

  1. 构建Next表。

在这一步中,利用类似动态规划的思想,从模式串首尾两端开始比较。如果首尾字符相同,则将两端的指针往后移动,并将Next表中对应位置赋值为当前已匹配的字符数。

如果首尾字符不相同,就需要回溯到已匹配字符数目更小的位置重新匹配,这个位置就是Next表给出的位置。如果该位置上的字符与当前字符相同,则继续向后匹配,否则就需要继续回溯到更小的位置。

  1. 利用Next表查找匹配。

在完成Next表的构建后,就可以利用该表在文本串中查找匹配。每一次比较中,先比较文本串中的一个字符是否与模式串中的字符匹配,如果匹配就继续向后匹配下一个字符。

如果不匹配,就需要回溯到Next表给出的位置重新匹配。

总结

本文介绍了用于模式搜索的KMP算法的Python程序实现,该算法可以高效地解决字符串匹配问题。代码实现过程比较简单,但是要理解算法的核心思想并掌握Next表的构建方法。