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

yizhihongxing

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

什么是KMP算法?

KMP算法是一种字符串匹配算法,可用于在一个字符串中查找另一个字符串出现的位置。它的核心思想是,当子串与主串不匹配时,可以利用已经得到的部分匹配结果,将子串移动到下一个可以匹配的位置,而不是从头开始逐个字符匹配。

KMP算法的步骤

KMP算法的实现主要有以下三个步骤:

  1. 预处理模式串
    对于模式串的每一位,我们求出它的前缀和后缀的最长公共部分。得到一个next数组,其中next[i]表示前i个字符组成的子串中,最长的相等前后缀的长度。

  2. 匹配过程
    对于主串和模式串,从左到右进行匹配,当匹配失败时,利用next数组将模式串向右移动一定的距离。

  3. 返回匹配结果

KMP算法Python实现示例

我们以在一个字符串中查找另一个字符串出现的位置为例,实现KMP算法的Python代码如下:

def kmp_search(pattern, text):
    """
    KMP算法查找主串中是否存在模式串,返回模式串在主串中的起始位置,或-1表示不匹配
    """
    # 构造next数组
    next = kmp_next(pattern)
    i, j = 0, 0
    while i < len(text) and j < len(pattern):
        if j == -1 or text[i] == pattern[j]:
            i, j = i+1, j+1
        else:
            j = next[j]
    if j == len(pattern):
        return i - j
    else:
        return -1

def kmp_next(pattern):
    """
    构造next数组
    """
    next = [-1] * len(pattern)
    i, j = 0, -1
    while i < len(pattern) - 1:
        if j == -1 or pattern[i] == pattern[j]:
            i, j = i+1, j+1
            next[i] = j
        else:
            j = next[j]
    return next

示例说明

下面我们用两个例子来说明如何使用KMP算法在字符串中查找另一个字符串。

例子1

在字符串“ABABCABCDABABCABDE”中查找模式串“ABABCABD”出现的位置。

text = "ABABCABCDABABCABDE"
pattern = "ABABCABD"

pos = kmp_search(pattern, text)
if pos == -1:
    print("未找到")
else:
    print(f"找到,在位置{pos}")

输出:

找到,在位置6

例子2

在字符串“bananas”中查找模式串“nas”出现的位置。

text = "bananas"
pattern = "nas"

pos = kmp_search(pattern, text)
if pos == -1:
    print("未找到")
else:
    print(f"找到,在位置{pos}")

输出:

找到,在位置4

总结

本篇文章介绍了KMP算法的实现步骤和Python代码,以及两个使用KMP算法的示例说明。

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

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

相关文章

  • 详解Python 字典排序

    Python 字典是一种无序的数据类型,而在有些情况下,我们需要对字典进行排序。这时,我们可以使用Python自带的sorted函数结合lambda函数实现字典的排序。 以下是使用方法的完整攻略: 字典按照键排序 首先,我们需要先创建一个字典,例如: scores = {"Alice": 82, "Bob": 90, …

    python-answer 2023年3月25日
    00
  • Python实现的百度站长自动URL提交小工具

    下面我将详细讲解如何实现一个简单的Python版百度站长自动URL提交小工具。 1、准备工作 在开始之前,需要确保电脑上已经安装好Python环境,并且安装了requests库。在终端中输入以下命令安装: pip install requests 2、获取百度站长平台的API 百度站长平台提供了API供开发者使用,我们需要先在其官网中注册并获取相应的API密…

    python 2023年5月19日
    00
  • 开发 python wsgi 应用程序时 Apache 重启

    【问题标题】:Apache restart when developing python wsgi apps开发 python wsgi 应用程序时 Apache 重启 【发布时间】:2023-04-03 10:28:01 【问题描述】: 我正在评估用于 Web 开发的 python (mod_wsgi),并注意到在 Windows 上我必须在更改我的 py…

    Python开发 2023年4月8日
    00
  • Python正则表达式re模块详解(建议收藏!)

    Python正则表达式re模块详解 正则表达式是一种用于描述字符串模式的语言,可以用于匹配、查找、替换和割字符串。Python中的re模块提供了正则表达式支持,方便进行字符串的处理。本文将详细讲解Python正则表达式的使用,包括正则表达式语法、re模块的常用函数以及两个常用匹配实例。 正则表达式语法 正则表达式由一些特殊字符和普通字符组成,用于字符串模式匹…

    python 2023年5月14日
    00
  • Python中的装饰器使用

    下面是对于Python中的装饰器使用的具体讲解。 什么是装饰器 在Python中,装饰器是一种特殊的函数,它可以在不改变原函数代码的情况下,为函数增加新的功能。我们可以使用装饰器来实现函数的日志记录,性能分析,缓存等等。 在Python中,装饰器是通过 @ 符号来使用的,一般放在被装饰函数之前。 装饰器使用 我们可以使用装饰器来给一个函数添加功能。接下来通过…

    python 2023年6月2日
    00
  • Python入门教程(十四)Python的集合

    对于Python入门教程(十四)Python的集合,我将为你提供详细的攻略。 1. 什么是Python中的集合? 集合是Python中一种特殊的数据类型,它是由一组无序、唯一的元素组成的。可以将集合看做是没有值的字典,只有键,而且键必须是不可变的类型。 2. 创建一个集合 可以使用set()函数来创建一个空的集合,也可以使用花括号{}或者使用set()函数加…

    python 2023年6月5日
    00
  • python实现用户答题功能

    下面我来详细讲解一下“Python实现用户答题功能”的完整攻略。 1. 准备工作 在开始之前,我们需要先安装以下两个必要的工具: Python:可以从官网下载安装。 PyCharm:可以从官网下载安装。 安装完成后,打开PyCharm,创建一个新的Python项目。 2. 编写代码 2.1 定义问题和答案 首先,我们需要定义一些问题和答案。可以将它们保存在一…

    python 2023年5月19日
    00
  • Python格式化输出–%s,%d,%f的代码解析

    Python格式化输出是Python中常用的输出方式之一,可以将输出内容按照指定格式进行输出。其中,常用的格式化输出符包括%s、%d、%f等。 %s格式输出字符串数据类型,例如: name = "John" print("My name is %s" % name) 输出结果为: My name is John %d用…

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