Python字符串匹配算法KMP实例

下面是详细讲解“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轮询机制控制led实例

    下面我将详细讲解“python轮询机制控制led实例”的完整攻略。 1. 轮询机制的概念和作用 轮询机制是指通过不断地循环查询某个状态来实现任务的执行。在实际编程中,轮询机制常被用于实现一些需要不断检测某个外部状态的任务,例如网络通讯、设备操作等。在这种情况下,我们往往需要通过轮询来获取外部状态的变化,并及时作出相应的响应。 在控制led实例的过程中,我们可…

    python 2023年5月19日
    00
  • python2.7的编码问题与解决方法

    Python2.7 的编码问题 Python 2.7 默认采用的编码格式是 ASCII 格式,这也就意味着 Python 2.7 在处理非 ASCII 编码的内容时,会出现编码问题。例如在读取采用 utf-8 格式编码的文件时,Python 2.7 会返回以下错误。 UnicodeDecodeError: ‘ascii’ codec can’t decode…

    python 2023年5月31日
    00
  • 一篇文章带你了解kali局域网攻击

    一篇文章带你了解kali局域网攻击 什么是Kali Linux? Kali Linux 是基于 Debian 的 GNU/Linux 发行版。设计用于数字鉴定和渗透测试。此操作系统包含了数百个预先安装好的工具,可以用于测试网络安全性,包括端口扫描、漏洞攻击、渗透测试等。 实施攻击前需要知道的基础信息 在使用Kali Linux进行攻击之前,需要先收集一些基础…

    python 2023年5月20日
    00
  • Python 爬虫学习笔记之正则表达式

    Python爬虫学习笔记之正则表达式 正则表达式是一种用于匹配字符串的强大工具,可以在Python爬虫中用于解析HTML、XML等文本数据。本攻略将详细讲解Python中正则表达式的基本语法、常用函数和示例应用。 正则表达式基本语法 正则表达式是由普通字符和特殊字符组成的字符串,用于描述一类字符串的模式。下面是一些常用的正则表达式特殊字符: .:匹配任意字符…

    python 2023年5月14日
    00
  • 详解Python中的各种函数的使用

    Python中有很多内置函数和标准库函数,这些函数可以帮助我们完成各种任务。下面是Python中常用函数的使用攻略: 1. 内置函数 Python中有很多内置函数,这些函数可以直接使用,无需导入任何模块。下面是一些常用的内置函数: print() print()函数用于将指定的对象输出到控制台。可以输出字符串、数字、列表、元组、字典等对象。 示例: prin…

    python 2023年5月13日
    00
  • 书单|人生苦短,你还不用python!

    书单|人生苦短,你还不用python! 为什么学习Python Python 是一种高级编程语言,使用简洁明了的语法和丰富的库,可以轻松完成各种开发任务。Python 具有以下优势: 易于学习: Python 代码简洁易懂,语法简单,拥有大量示例代码和教程方便学习使用。 应用广泛: Python 可以在各种领域应用,如 Web 开发、人工智能、数据分析、爬虫…

    python 2023年5月14日
    00
  • python调用c++传递数组的实例

    对于这个问题,我可以提供以下完整的攻略来解决它。 Python调用C++传递数组的实例 在Python中调用C++代码时,我们可能会需要传递数组类型的参数。对于这种情况,我们可以使用ctypes库来帮助我们完成C++和Python之间的数据交换。下面我将演示如何使用ctypes来实现Python调用C++传递数组的实例。 示例1:Python传递列表,C++…

    python 2023年6月5日
    00
  • python实现的简单RPG游戏流程实例

    好的。首先,我们需要了解什么是RPG游戏。简单来说,RPG游戏是指角色扮演游戏,玩家扮演一个或多个角色,在游戏中进行冒险、战斗、探险等操作,并通过完成任务获得经验、金币等奖励,提升角色的属性和能力,以挑战更高难度的关卡。 下面,我们来讲解如何使用Python实现一个简单的RPG游戏。整个游戏的主要流程如下: 初始化角色 游戏开始时,需要初始化玩家角色,包括角…

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