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 selenium爬取斗鱼所有直播房间信息过程详解

    Python Selenium爬取斗鱼所有直播房间信息过程详解 本攻略将介绍如何使用Python Selenium爬取斗鱼所有直播房间信息。我们将使用Selenium库模拟浏览器行为,并使用BeautifulSoup库解析HTML响应。 安装Selenium和BeautifulSoup库 在开始前,我们需要安装Selenium和BeautifulSoup库。…

    python 2023年5月15日
    00
  • python 随机森林算法及其优化详解

    下面是详细讲解“Python随机森林算法及其优化详解”的完整攻略。 随机森林算法 随机森林是一种集成学习算法,是由多个决策树组成的。随机森林的基本思是通过对多个决策树的预测结果进行综合,来得到更加准确的预测结果。 随机森林算法的主要骤如下: 从原始数据集中随机选择一定数量的样本,建一个训练集。 随机选择一定数量特征,构建一个决树。 重复步骤1和步骤2,构建多…

    python 2023年5月14日
    00
  • python模块之time模块(实例讲解)

    Python模块之time模块(实例讲解) time模块是Python的标准库之一,提供了一些处理日期、时间和时间范围的函数。这个模块包含了许多时间函数,其中一些被底层操作系统用于处理时间戳。在此,我们将重点介绍在Python代码中使用time模块的方法。 time模块主要函数 下面是time模块中常用的一些函数及其作用。 time.time() 返回当前时…

    python 2023年5月14日
    00
  • Python类的定义继承调用比较方法技巧

    Python是一门面向对象的语言,类的定义、继承与调用是Python中常用的操作,掌握这些技巧能够使代码更加模块化、复用性更强。本攻略将重点讲解Python类的定义、继承及调用比较方法的技巧,以下为详细说明: 一、类(Class)的定义 在Python中,定义一个类需要用到关键字class,从而定义一个类的名称、属性和方法等。具体格式如下: class Cl…

    python 2023年6月3日
    00
  • pytest多线程与多设备并发appium

    下面是关于“pytest多线程与多设备并发appium”的完整攻略。 1. 准备工作 在开始之前,我们需要准备以下工作: 安装appium:npm install -g appium 安装pytest、pytest-xdist、pytest-html等依赖包: python pip install pytest pytest-xdist pytest-htm…

    python 2023年5月19日
    00
  • Django RestFramework 全局异常处理详解

    Django RestFramework 全局异常处理详解 在Django RestFramework中,全局异常处理是一种非常重要的概念。全局异常处理可以帮助我们捕获处理应用程序的异常,从而提高应用程序稳定性和可靠性。本文将介绍Django RestFramework中的全局异常处理,包括处理的定义、异常处理器的注册、异常器的使用等方面的内容。 异常处理器…

    python 2023年5月13日
    00
  • python实现excel和csv中的vlookup函数示例代码

    下面是详细的Python实现Excel和CSV中的VLOOKUP函数的教程。 1. 什么是VLOOKUP函数 在Excel或CSV中,VLOOKUP函数是一种非常常用的函数,用于在第一个数据区域中查找某个值,并在相同行中返回另一个数据区域中的值。 VLOOKUP函数的常规格式为: =VLOOKUP(value, table, column, [range_l…

    python 2023年5月13日
    00
  • 解决python xlrd无法读取excel文件的问题

    下面是一份详细讲解如何解决python xlrd无法读取excel文件的问题的实例教程。教程中会涉及到安装xlrd库、Python的基本语法、对Excel文件进行读取等方面。 原因分析 在这份教程中,我们假设在读取Excel文件时,程序反复给出“ModuleNotFoundError: No module named ‘xlrd’”的错误提示。 经过简单检查…

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