Python字符串匹配算法KMP实例

yizhihongxing

下面是详细讲解“Python字符串匹配算法KMP实例”的完整攻略。

KMP算法

KMP算法是一种匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。该算法的核心思想是利用已经匹配过,尽量减少模式串与文本串的匹配次数,从而提高匹配效率。

下面是一个Python实现KMP算示例:

def kmp_search(text, pattern):
    n = len(text)
    m = len(pattern)
    if m == 0:
        return 0
    if n < m:
        return -1
    lps = [] m
    j = 0
    compute_lps(pattern, m, lps)
    i = 0
    while i < n:
        if pattern[j] == text[i]:
            i += 1
            j += 1
        if j ==:
            return i - j
        elif i < n and pattern[j] != text[i]:
            if j != 0:
                j = lps[j-1]
            else:
                i += 1
    return -1

def compute_lps(pattern, m, lps):
    len = 0
    lps[0] = 0
    i = 1
    while i < m:
        if pattern[i] == pattern[len]:
            len += 1
            lps[i] = len
            i += 1
        else:
            if len != 0:
                len = lps[len-1]
            else:
                lps[i] = 0
                i += 1

上述代码中,首先定义了一个kmp_search函数,该函数接受一个文本串和一个模式串返回模式串在文本串的出现位置。

接着,定义了一个compute_lps函数,该函数用于计算模式串的最长共前后缀(Longest Prefix Suffix,LPS)。

然后,初始化变量n和m,分别表示文本串和模式串的长度。

接着,判断模式串是否为空,如果为空,则返回0;如果文本串长度小于模式串,则返回-1。

然后,初始化变量lps,用于存储模式串的LPS。

接着,调用compute_lps函数计算模式串的LPS。

然后,初始化变量i和j,分别表示文本串和模式串的当前位置。

接着,使用while循环遍历文本串,如果当前字符匹配,则i和j分别加1;如果不匹配,则j更新为lps[j1]。

最后,如果j等于模式串的长度,则说明模式串在文本串中出现,返回i - j;否则,返回1。

KMP算法的优化

KMP算法的效率受到模式串的LPS的影响。为了提高算法的效率,可以使用优化的LPS计算方法,如Z算法、扩展KMP算法等。

下是一个Z算法优化KMP算法的Python示例:

def z_algorithm(text, pattern):
    s = pattern + '$' + text
    n = len(s)
    z = [0] * n
    l, r = 0, 0
    for i in range(1, n):
        if i > r:
            l, r = i, i
 r < and s[r-l] == s[r]:
                r += 1
            z[i] = r - l
            r -= 1
        else:
            k = i - l
            if z[k] < r - i + 1:
                z[i] = z[k]
            else:
                l = i
                while r < n and s[r-l] == s[r]:
                    r += 1
                z[i] = r - l
                r -= 1
    return z

def kmp_search(text, pattern):
    n = len(text)
    m = len(pattern)
    if m == 0:
        return 0
    if n < m:
        return -1
    z = z_algorithm(text, pattern)
    for i in range(m+1, n+1):
        if z[i] == m:
            return i - m - 1
    return -1

上述代码中,首先定义了一个z_algorithm函数,该函数接受一个文本串和一个模式串,返回Z数组。

然后,定义了一个kmp_search函数,该函数接受一个文本串和一个式,返回模式串在文本串中的出现位置。

接着,将模式串和文本串拼接起来,中间加上一个特字符,用于计算Z数组。

然后,初始化变量n和m,分别表示文本串和模式串的长度。

接着,判断模式串是否为空,如果为空,则返回0;如果文本串长度小于模串长度,则返回-1。

然后,调用z_algorithm函数计Z数组。

接着,使用for循环遍历Z数组,如果Z数组中的个元素等于模式串的长度,则说明模式串在文串中出现,返回该位置减去模式串的长度。

最后,如果没有找到模式串,则返回-1。

示例

下面是一个使用KMP算法查找模式串在文本串中出现位置的Python示例:

text = 'ABABDABACDABABCABAB'
pattern = 'ABABCABAB'
result = kmp_search(text, pattern)
if result == -1:
    print('Pattern not found in text')
else:
    print('Pattern found at index', result)

上述代码中,首先定义了一个文本串text和一个模式串pattern。

然后,调用kmp_search函数查找模式串在文本串中的出现位置。

最后,如果模式串未在文本串中出现,则输出“Pattern not found in text”;否则,输出“Pattern found at index”和模式串在文本串中的位置。

下面是一个使用Z算法优化KMP算法查找模式串在文本串中出现位置的Python示例:

text = 'ABABDABACDABABCABAB'
pattern = 'ABABCABAB'
result = kmp_search(text,)
if result == -1:
    print('Pattern not found in text')
else:
    print('Pattern found at index', result)

上述代码中,首先定义了一个文本串text和一个模式串pattern。

然后,调用kmp_search函数查找模式串文本串中的出现位置。

最后,如果模式串未在文本串中出现,则输出“Pattern not found in text”;否则,输出“Pattern found at index”和模式串在文本串中的位置。

总结

KMP算法是一种常用的字符串配算,用于在一个文本串中查找一个模式串的现位置。Python中可以使用Z算法等优化方法来提高KMP算法的效率。在实现过程中,需要计算模式的LPS或Z数组,然后while循环或for循环遍历文本串,查找模式串的出现位置。

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

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

相关文章

  • python数据结构算法分析

    下面是关于“Python数据结构算法分析”的完整攻略。 1. 数据结构 1.1 列表 列表是Python中最常用的数据结构之一,它可以存储任类型的数据,并且支持动态扩容。在Python中,我们可以使用[]或list()函数来创建一个列表。 # 创建列表 my_list = [1, 2, 3, ‘hello’, ‘world’] 1.2 元组 元组是Pytho…

    python 2023年5月13日
    00
  • Python开发企业微信机器人每天定时发消息实例

    以下是Python开发企业微信机器人每天定时发消息的完整攻略。 一、准备工作 获取企业微信机器人的webhook地址,可以通过企业微信管理后台->应用管理->自建应用->基本信息->Webhook中获取。此处以https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=XXXXXXXX-X…

    python 2023年5月23日
    00
  • Python Flask 请求数据获取响应详解

    Python Flask请求数据获取响应详解 什么是 Python Flask Python Flask 是一个轻量级的 Web 应用框架。它的设计原则是让开发 Web 应用变得简单和快速。Flask 的核心是 WSGI 工具箱,它负责管理 Flask 的请求和响应。Flask 还提供了一些有用的扩展功能,方便我们处理数据和连接到数据库服务器等。 Flask…

    python 2023年5月14日
    00
  • 基于python发送邮件的乱码问题的解决办法

    下面是详细讲解“基于Python发送邮件的乱码问题的解决办法”的完整攻略。 问题描述 在使用 Python 发送邮件时,有些情况下邮件的内容会出现乱码,这给邮件的发送和阅读带来了不便。这种乱码通常是由于邮件的编码方式与邮件内容的编码方式不一致所致。 解决方案 解决邮件乱码问题的方法主要有以下两种: 方法一:设置邮件内容的编码方式 在使用 Python 发送邮…

    python 2023年5月20日
    00
  • python并发爬虫实用工具tomorrow实用解析

    介绍 tomorrow 是一个使用 python 开发的并发爬虫工具,可以实现简单的多线程/多进程执行代码,并且非常易于使用。这个工具的特点就是:它能够自动将一个函数转化为一个线程或进程,并且允许你设置线程和进程池的大小。在使用 tomorrow 来实现爬虫的时候,我们只需要将爬虫函数用 @tomorrow.thread 或 @tomorrow.proces…

    python 2023年5月19日
    00
  • 使用 selenium python 和 Firefox 重新打开相同的浏览器窗口

    【问题标题】:Reopen same browser window using selenium python and Firefox使用 selenium python 和 Firefox 重新打开相同的浏览器窗口 【发布时间】:2023-04-06 01:09:02 【问题描述】: 嘿,我正在尝试制作一个自动程序来发送 Whatsapp 消息。我目前正在…

    Python开发 2023年4月6日
    00
  • python模拟登录并且保持cookie的方法详解

    在Python中,可以使用requests库模拟登录并保持cookie。requests库是一个Python HTTP客户端库,可以用于发送HTTP请求和处理HTTP响应。以下是详细的攻略,介绍如何使用Python模拟登录并保持cookie: 模拟登录并保持cookie 可以使用requests库模拟登录并保持cookie。以下是一个示例,演示如何使用Pyt…

    python 2023年5月14日
    00
  • 快速排序(整数)的C语言代码和JAVA代码

    一、问题描述 我们目前有一些数据,这些数据都是整数,然后我们现在需要做的就是把这些数据按照小到大排一下,然后输出出来。 二、问题的解决办法 首先确认一下分界点,我们常见的分界点是第一个点,第二个点,中间的一个点; 然后我们调整一下范围,也就说所有小于等于某个点的值在左半边,大于等于某个点的值在右半边。 递归处理左右两端。 案例如下: 我们首先手头有一些数据,…

    算法与数据结构 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部