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

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日

相关文章

  • Python3.5 win10环境下导入kera/tensorflow报错的解决方法

    Python3.5win10环境下导入kera/tensorflow报错的解决方法 在Python3.5win10环境下,导入keras/tensorflow时,可能会遇到各种报错问题。本文将介绍一些常见的报错问题及其解决方法。 报错问题1:ModuleNotFoundError: No module named ‘keras’ 这个报错问题是由于没有安装k…

    python 2023年5月13日
    00
  • 详细解读Python中解析XML数据的方法

    XML是一种常见的数据格式,用于在不同的应用程序之间传输数据。Python提供了多种解析XML的方法,包括ElementTree、minidom和SAX等。以下是详细解读Python中解析XML数据的方法,包含两个示例。 示例1:使用ElementTree解析XML 以下是一个示例,可以使用ElementTree解析: import xml.etree.El…

    python 2023年5月15日
    00
  • python解决字典中的值是列表问题的方法

    Python解决字典中某个key对应的值是列表的问题很常见,为此我们提供以下攻略。 方法一:使用setdefault函数 对于字典中的某个key,如果值是列表,我们可以使用setdefault函数进行处理。 setdefault函数接受两个参数:key表示字典中要查找的键;默认值为key对应的值,如果键不存在于字典中,才将key插入到字典中。对于本题中的问题…

    python 2023年5月13日
    00
  • Python中处理字符串的相关的len()方法的使用简介

    标题 Python中处理字符串的相关的len()方法的使用简介 正文 在Python中,字符串是一种不可变的类型,它是由字符组成的一种序列。对于字符串的处理,len()方法是一种非常常用的方法,它可以获取字符串的长度。本文将对Python中len()方法的使用进行详细介绍,包括基本用法、注意事项及示例。 基本用法 len()方法是Python内置的方法,用于…

    python 2023年6月5日
    00
  • 如何在Python中降低稀疏矩阵的维度

    在Python中降低稀疏矩阵的维度有多种方法,下面介绍两种常用的方法:压缩稀疏行(CSR)格式和奇异值分解(SVD)。 CSR格式 CSR格式是一种常用的存储稀疏矩阵的方法,它能够在不显式地存储零元素的情况下存储非零元素。在Python中,可以使用Scipy库提供的sparse模块来实现CSR格式的稀疏矩阵。 以下是降低稀疏矩阵的维度的示例代码: impor…

    python-answer 2023年3月25日
    00
  • 如何从python中的timedelta对象获取分钟和秒(mm:ss)

    【问题标题】:How to get minutes and seconds(mm:ss) from a timedelta object in python如何从python中的timedelta对象获取分钟和秒(mm:ss) 【发布时间】:2023-04-05 17:00:01 【问题描述】: 我正在编写一个代码,其中我为每个话语添加了持续时间(作为每个话…

    Python开发 2023年4月5日
    00
  • VUE+ElementUI下载文件的几种方式(小结)

    下面我就来讲解一下“VUE+ElementUI下载文件的几种方式(小结)”这篇文章的完整实例教程,具体内容如下。 1. 示例说明 该篇文章主要介绍了VUE+ElementUI下载文件的几种方式,并提供了完整的代码实例。以下我们就以其中的两种方式为例来作为示例,分别是axios和原生JavaScript实现。 2. axios下载文件示例 首先,我们要安装ax…

    python 2023年5月13日
    00
  • 超详细注释之OpenCV制作图像Mask

    超详细注释之OpenCV制作图像Mask 什么是图像Mask? 在数字图像处理中,一个Mask(掩码)是一张二进制图像(黑白图像),它用来指示图像的某些部分是否需要被处理。 图像Mask是一种非常常见的图像处理技术,它可以使得我们只对图像的感兴趣区域进行处理,而不必关心整张图像的所有像素值。 制作图像Mask的步骤 首先,我们需要载入图像,然后选择感兴趣区域…

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