python实现字符串匹配算法BF,BF改,KMP

2023-11-08

包含:BF,BF改进版本,KMP

BF:暴力搜索

BF改:当判断匹配失败的字符串是不是与首字母相同 若不同,继续BF算法; 若相同,直接将首字母移到当前位置

KMP:通过前缀与后缀发现待匹配字符串本身的特性,匹配失败时一次性移动多个字符以减少工作量

# hstring为长字符串;substring为待匹配的字符串
def bf(hstring: str, substring: str):
    hlen = len(hstring)
    slen = len(substring)
    if (hlen == 0) or (slen == 0) or (hlen < slen):
        return None
    for i in range(hlen - slen + 1):  # 母串逐一字符匹配
        is_find = True
        for j in range(slen):  # 循环子串
            if hstring[i + j] != substring[j]:
                is_find = False
                break  # 如果匹配失败,之前所做的所有匹配工作全部舍弃,转而开始母串下一个字符的重新匹配
        if is_find:
            return i
    return False


def bf_plus(hstring: str, substring: str):
    hlen = len(hstring)
    slen = len(substring)
    if (hlen == 0) or (slen == 0) or (hlen < slen):
        return None
    i = 0
    while i < hlen - slen:
        is_find = True
        for j in range(slen):  # 循环子串
            ch1 = hstring[i + j]
            ch2 = substring[j]
            if ch1 != ch2:
                is_find = False
                # 当匹配失败时,检查败的字符串是不是与首字母相同,若不同,继续BF算法;若相同,直接将首字母移到当前位置
                if (ch1 == substring[0]) and (j >= 1):
                    ipos = i + j
                    i = ipos - 1
                break
        i += 1
        if is_find:
            return i - 1
    return False


def KMP(hstring, substring):
    hlen = len(hstring)
    slen = len(substring)
    if (hlen == 0) or (slen == 0) or (hlen < slen):
        return None

    def get_move_list(string):  # 根据最长前缀与最长后缀判断移动的位置
        n = len(string)
        temp_move_list = [0]  # 只有一个字符填充为0
        j = 0
        for i in range(1, n):
            while j > 0 and string[i] != string[j]:
                j = temp_move_list[j]
            if string[i] == string[j]:
                j += 1
            temp_move_list.append(j)
        return temp_move_list

    move_list = get_move_list(substring)
    j = 0
    for i in range(hlen):
        while hstring[i] != substring[j] and j > 0:
            j = move_list[j - 1]  # 匹配失败,确定移动后的位置
        if hstring[i] == substring[j]:
            j += 1
            if j == slen:
                return i - slen + 1
    return False

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python实现字符串匹配算法BF,BF改,KMP 的相关文章

随机推荐

  • 《数据结构》第4章 串、数组和广义表

    数据结构 第4章 串 数组和广义表 第4章 串 数组和广义表 4 1 串的定义 4 2 串的类型定义 存储及其 运算 知识点1 串的表示 方法1 定长顺序存储表示 方法2 堆分配存储表示 方法3 串的块链存储表示 知识点2 必考 串的模式匹
  • Snipaste - 截图工具

    Snipaste 简介 Snipaste 是一个简单开源且强大的截图工具 也可以让你将截图贴回到屏幕上 下载并打开 Snipaste 按下 F1 来开始截图 再按 F3 截图就在桌面置顶显示了 就这么简单 你还可以将剪贴板里的文字或者颜色信
  • VS2008配置opencv

    配置过程 1 需要先提前安装好VS2008并下载好opencv的库 2 配置Windows环境变量 具体步骤为 右键我的电脑 属性 详细设定标签里 gt 环境变量 gt 系统变量 找到Path 将D Program Files opencv
  • 网络通信之应用层协议--Linux

    文章目录 关于应用层协议的理解 应用层协议的制定 理论部分 代码部分 完整代码以及测试 HTTP协议 代码测试HTTP协议 HTTPS协议 加密原因 基础的加密方式 数据摘要 数据指纹 数字签名 HTTPS的加密方式的选择 总结 关于应用层
  • OWASP TOP-10(2023) API风险

    OWASP API 1 对象级别授权失效 水平越权 攻击者就可以通过改变请求中的对象ID来绕过授权限制 从而获取敏感数据或者完全掌控账户 这个漏洞在基于API的应用程序中非常普遍 因为服务器通常无法跟踪完整的用户状态 而是依赖于请求参数中的
  • 网络攻防复习篇

    绪论 1 网络空间的4个要素 设施 数据 用户 操作 见第一章PPT 61页 下面这个图要背好 2 网络空间安全基本概念 络空间安全涉及到 络空间中的电磁设备 电 信息系统 运 数据和系统应 中所存在的安全问题 既要防 保护 信息通信技术系
  • open3d读取、显示和保存点云数据

    1 从文件中读取点云 接口1 bool open3d io ReadPointCloud const std string filename geometry PointCloud pointcloud const ReadPointClo
  • NCC申请授权

    1 进入home路径下的bin文件夹 打开sysconfig配置文件 2 在sysconfig配置界面 点击license 生成硬件锁 在弹框界面输入产品号 产品号可在点击 读取授权 按钮后 进行查看 后 点击确定 自动生成一个hardke
  • CryptoPP使用介绍

    CryptoPP使用介绍 发表时间 2012年06月15 分类 编程开发 作者 天缘 Crypto 是个免费的C 加解密类库 由于资格太老 持续更新 最新版本到了CryptoPP 5 6 对天缘而言 第一眼看到CryptoPP就感觉头大 根
  • 文本语言模型的参数估计-最大似然估计、MAP及贝叶斯估计

    以PLSA和LDA为代表的文本语言模型是当今统计自然语言处理研究的热点问题 这类语言模型一般都是对文本的生成过程提出自己的概率图模型 然后利用观察到的语料数据对模型参数做估计 有了语言模型和相应的模型参数 我们可以有很多重要的应用 比如文本
  • JavaWeb - Servlet:重定向和转发,状态管理

    Servlet JDBC 应用 在 Servlet 中可以使用 JDBC 技术访问数据库 常见功能如下 查询 DB 数据 然后生成显示页面 例如 列表显示功能 接收请求参数 然后对 DB 操作 例如 注册 登录 修改密码等功能 为了方便重用
  • 代理重加密(Proxy Re-Encryption)技术原理和Java代码实现

    欢迎关注公众号 区块链之美 致力于区块链技术研究 传播区块链技术和解决方案 区块链应用落地 区块链行业动态等 1 代理重加秘的应用介绍 由于大部分的云服务供应商并不能完全值得信任 云服务供应商可能会在未经用户允许的情况下 擅自泄露用户的隐私
  • 【node】10、express模块搭建服务

    express模块是一个外部引入模块 不是node内部自身的模块 所以需要下载express模块才能引入 下载express之前需要初始化项目文件 npm init y 初始化后安装express npm install express 安
  • org.springframework.aop.AopInvocationException: Null return value from advice does not match primiti

    private static Object processReturnType Object proxy Object target Method method Object retVal Massage return value if n
  • Python3 TypeError: Required argument ‘outImg‘ (pos 3) not found

    问题 在用python3使用img3 cv2 drawMatchesKnn img1 kp1 img2 kp2 good flags 2 的时候 可能会产生错误 TypeError Required argument outImg pos
  • solidity 安全 合约的短地址攻击——这个锅谁来背

    前一段时间 有个用户用说发交易的时候提示地址错误 后来发现发送的地址少了一字节 所以钱包检测发送地址时 会提示错误 当时也没当回事 以为是用户自己搞错了 最近研究solidity的时候 才明白了当时是怎么回事 原来这个用户遇到了短地址攻击
  • 超详细解释MyBatis与Spring的集成原理

    前言 最原始的MyBatis的使用 通常有如下几个步骤 读取配置文件mybatis config xml构建SqlSessionFactory 通过SqlSessionFactory拿到SqlSession 通过SqlSession拿到Ma
  • SpringCloud

    文章目录 微服务架构 SpringCloud 二 上篇SpringCloud本Cloud 1 SpringCloud的命名规则及版本关系 1 1 springboot与springcloud的版本依赖 1 2 本次博文使用的环境及版本 2
  • 浅谈NB-IOT模块调试

    背景 在物联网的口号下 我们公司也有幸踏足NB物联这块 当然也只是二次应用开发 NB核心开发技术都掌握在几个大公司大佬手里 例如 华为海思 高通 intel 当然模块 厂商又例如 移远 ublox等 芯片的资料和技术不像Lora这样开源 所
  • python实现字符串匹配算法BF,BF改,KMP

    包含 BF BF改进版本 KMP BF 暴力搜索 BF改 当判断匹配失败的字符串是不是与首字母相同 若不同 继续BF算法 若相同 直接将首字母移到当前位置 KMP 通过前缀与后缀发现待匹配字符串本身的特性 匹配失败时一次性移动多个字符以减少