Python实现字符串匹配的KMP算法

yizhihongxing

Python实现字符串匹配的KMP算法

什么是KMP算法

KMP算法是一种字符串匹配算法,其核心思想是利用已知信息尽量减少匹配的时间。
通常来说,我们在匹配字符串时,常用的方法是从头开始,逐个字符进行比较,直到匹配成功或者匹配失败为止。但是这种方法的效率并不高,尤其是在长串匹配的情况下,就会出现时间复杂度很高的问题。
KMP算法通过建立一个next数组,存储在匹配过程中已经匹配过的信息,从而避免了重复匹配的情况,使算法的效率得以提升。

KMP算法步骤

KMP算法的实现主要包括如下几个步骤:

  1. 计算next数组:next数组中存储着在匹配字符串过程中已经匹配过的信息,用于在匹配失败时尽量减少匹配次数。
    具体计算方法是:在模式串中,以每个字符为尾的字符串中,最长的既是该字符串的前缀又是该字符串的后缀的字符串的长度。
    例如,模式串为“ababaca”,对应的next数组为[-1,0,0,1,2,0,1]。
    其中,next[0]=-1,next[1]=0,next[2]=0,以此类推。

  2. 进行匹配:从主串的第一个字符开始,依次和模式串中的字符进行匹配。
    当匹配失败时,根据next数组的值,选择滑动到模式串中的哪一个位置继续匹配。
    当匹配成功时,返回主串中该子串的位置。

KMP算法实现示例

下面分别展示KMP算法的计算next数组和匹配主串的实现。

计算next数组

def get_next(p: str) -> list[int]:
    """
    计算next数组
    """
    m = len(p)
    next = [-1] * m
    k, j = -1, 0
    while j < m - 1:
        if k == -1 or p[k] == p[j]:
            k, j = k + 1, j + 1
            next[j] = k
        else:
            k = next[k]
    return next

以上代码中,函数get_next接受一个字符串p作为参数,返回p的next数组。
next数组初始化为-1,-1表示从模式串的开头开始匹配。
变量k和j分别指向模式串中的字符和next数组中的值,初始值为-1和0。
当p[k] == p[j]时,next[j+1]的值为k+1,表示下一次匹配时,主串的下一个字符和模式串的第k+1个字符进行比较。
否则,next[k]的值表示模式串向右移动的幅度。

匹配主串

def kmp_search(s: str, p: str) -> int:
    """
    KMP算法匹配主串
    """
    n, m = len(s), len(p)
    next = get_next(p)
    i, j = 0, 0
    while i < n and j < m:
        if j == -1 or s[i] == p[j]:
            i, j = i + 1, j + 1
        else:
            j = next[j]
    if j == m:
        return i - m
    return -1

以上代码中,函数kmp_search接受两个参数,s表示主串,p表示模式串,返回模式串在主串中的位置。
首先获取模式串的next数组,然后用变量i和j分别指向主串和模式串中的字符,初始值为0。
当匹配成功时,i和j分别递增,并继续匹配下一个字符。
当匹配失败时,更新j的值为next[j]。若next[j]=-1,则说明需要将模式串向右移动一位,即j+1。
当j = m时,说明匹配成功,返回主串中该子串的位置。

示例

代码如下:

s = "BBC ABCDAB ABCDABCDABDE"
p= "ABCDABD"
print(kmp_search(s,p)) # 输出15

以上代码中,主串s为BBC ABCDAB ABCDABCDABDE,模式串p为ABCDABD。
运行程序后,将返回模式串在主串中的位置,即15。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现字符串匹配的KMP算法 - Python技术站

(0)
上一篇 2023年6月5日
下一篇 2023年6月5日

相关文章

  • Python竟能画这么漂亮的花,帅呆了(代码分享)

    这里是关于“Python竟能画这么漂亮的花,帅呆了(代码分享)”完整攻略的详细讲解。 简介 “Python竟能画这么漂亮的花,帅呆了(代码分享)”是一篇使用Python绘制花朵的文章。通过使用Python的turtle库,作者展示了如何通过一些简单的代码,绘制出美丽的花朵图案。 准备工作 在进行绘图前,需要引入turtle库,可以通过以下代码来导入: imp…

    python 2023年5月19日
    00
  • parser.add_argument中的action使用

    argparse是Python内置的命令行参数解析模块。在使用add_argument方法时,可以通过action参数指定对参数的特殊处理方式。下面我将详细讲解parser.add_argument中的action使用的完整攻略,包括常用的几种action和它们的用法。 store 使用store时,将参数值存储到args的命名空间中。如果在命令行中指定了参…

    python 2023年6月3日
    00
  • Python基于回溯法子集树模板实现8皇后问题

    下面是详细讲解“Python基于回溯法子集树模板实现8皇后问题”的完整攻略。 1. 什么是回溯法 回溯法是一种通过断尝试和回溯来寻找解的算法。它通常用于解决组合问题、排列问题、子集问题等。回溯的基本思想是:从问题的某一种状态开始搜索,当搜索到某一状态时,如果这种状态不是问题的解,则回溯到上一个状态续搜索。 2. 子集树模板 子集树是回溯法的一种常用模板,它通…

    python 2023年5月14日
    00
  • 五分钟学会怎么用python做一个简单的贪吃蛇

    如何用Python做一个简单的贪吃蛇? 作为一名Python爱好者,想必你对Python的学习及应用有了一定的基础。当你已经学习了一段时间的Python后,做一个简单的游戏可以帮助你更好地巩固所学的知识,并且更好地理解Python的面向对象编程。 在这里,我将向你分享一个制作简单贪吃蛇游戏的完整攻略。这个游戏的规则是很简单的:你需要控制一条蛇,让它在屏幕上吃…

    python 2023年5月19日
    00
  • Python读取Word文档中的Excel嵌入文件的方法详解

    让我详细讲解一下如何通过Python读取Word文档中的Excel嵌入文件。 1. 获取Word文档中的Excel嵌入文件 首先,我们需要获取Word文档中的Excel嵌入文件。我们可以使用Python中的docx2python库来读取Word文档,然后使用olefile库来获取嵌入对象。以下是一个示例: import olefile from docx2p…

    python 2023年5月13日
    00
  • Python3实现的字典、列表和json对象互转功能示例

    Python3实现字典、列表和JSON对象互转功能示例 1.背景 在Python编程中,字典、列表和JSON对象是常用的数据结构。这些数据结构在不同的场景下都有不同的用途,而且在实际应用中也需要进行互相转换。因此,学会如何在它们之间进行转换是非常重要的,也是我们必须掌握的基本操作。 2.实现方法 将一个字典或列表对象转换为JSON对象可以通过Python中的…

    python 2023年5月13日
    00
  • Golang GBK转UTF-8的例子

    针对“Golang GBK转UTF-8的例子”的问题,我可以提供以下完整攻略: 1. 确定源数据的编码格式 在进行GB2312(简称GBK)转UTF-8的操作前,需要先确定源数据的编码格式,因为GBK编码是针对汉字等中文字符的一种编码方式,而UTF-8编码则是一种国际编码标准,两种编码方式在字符的表示和存储上有一定的差异。 可以通过以下方法来确定源数据的编码…

    python 2023年5月20日
    00
  • python读取中文路径时出错(2种解决方案)

    在Python编程中,有时候我们会遇到读取中文路径时出错的问题。这通常是由于编码问题引起的。本攻略将提供解决问题的两种方法,并提供两个示例。 解决方法 以下是解决读取中文路径时出错的两种方法: os.path.abspath方法 使用os.path.join方法 使用os.path.abspath方法 我们可以使用os.path.abspath方法来解决读取…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部