数据结构-KMP算法

KMP算法

  • 简单的模式匹配算法

    • 定义:子串的定位操作通常称为串的模式匹配,他求的是子串在主串中的位置
    • 过程
      • 逐个字符比较
        1. 从主串指针 i 对应的字符和模式串指针 j 对应的字符开始,依次比较它们是否相等。
        2. 若相等,则同时移动 i 和 j 向右一位,继续比较下一个字符。
      • 失配处理
        1. 若不相等,则表明当前子串不匹配,需要根据算法类型采取不同的策略:
        2. 朴素匹配:主串指针 i 回退一位(恢复到失配前的状态),模式串指针 j 重置为起始位置,然后继续比较。
        3. 模式匹配KMP:根据预先计算的模式串的部分匹配表,将模式串指针 j 直接移动到新位置(不回溯主串),继续比较。
  • 核心思想

    • 利用已知的匹配信息

      在进行字符串匹配的过程中,当模式串与主串在某个位置发生失配时,KMP算法意识到已有的部分匹配并没有被完全浪费。这是因为,从模式串的起始位置到失配点,有一段子串已经在主串中成功匹配。这一段已匹配的子串提供了关于模式串结构的重要信息。

    • 避免回溯主串

      • 在朴素的字符串匹配算法中,一旦发生失配,需要将模式串回溯到下一个位置(通常是前一个字符),然后继续从主串的同一位置开始重新比较。这种回溯过程可能导致大量的重复比较,尤其是在模式串中有较长相同前缀的情况下
      • KMP算法的核心创新在于,它通过预先计算的“部分匹配表”(LPS表)来确定模式串失配后的下一个起始比较位置,而不需要回溯主串。部分匹配表记录了模式串中每个前缀的最长相同真前缀(同时也是后缀)的长度。当失配发生时,可以根据当前失配点对应的部分匹配表值,直接将模式串滑动到主串中相应的新位置,继续比较,而不是回溯主串。
  • 部分匹配表(LPS)

    • 最长公共前后缀:
      • 对A这个子串,前缀集合,后缀集合都为空

      • 对AB这个子串,前缀集合{A},后缀集合{B}

      • 对于ABA这个子串,前缀集合{A,AB}后缀集合{A,BA}

      • 对于ABAB这个子串,前缀集合{A,AB,ABA}后缀集合{B,AB,BAB}

      • 对于ABABC这个子串,前缀集合{A,AB,ABA,ABAB},后缀集合{C,BC,ABC,BABC}

      • 从而得到他们的next数组,部分匹配表

        ABABC
        NEXT(最长公共前后缀长度)00120
  • 代码实现

        //获取KMP算法中的next数组public static int[] kmpNext(String dest){//创建next数组int[] next=new int[dest.length()];next[0]=0;//获取next数组for (int i=1,j=0;i<dest.length();i++){while (j>0&&dest.charAt(i)!=dest.charAt(j)){j=next[j-1];}if (dest.charAt(i)==dest.charAt(j)){j++;}next[i]=j;}return next;}//j变量的作用1.追踪最长相同真前缀:初始化时,j 被设置为 0,表示当前正在考虑的最长相同真前缀起始于模式串的第一个字符。在外层 for 循环中,随着 i 从 1 到 dest.length()-1 递增,j 用于追踪模式串中以第 i 个字符结尾的子串的最长相同真前缀的最后一个字符的索引。2.更新最长相同真前缀:当 dest.charAt(i) 与 dest.charAt(j) 相等时,说明当前字符可以延长最长相同真前缀,因此将 j 增加 1,继续追踪更长的相同真前缀。将 j 设置为 next[j-1],意味着将当前考虑的最长相同真前缀的起始位置回溯到这个较短的相同真前缀的起始位置。这样做可以避免重新检查那些已经确认匹配的字符,因为它们构成了相同的真前缀。
    
        /**** @param str1 模式串* @param str2 子串* @param next next数组* @return 若没找到返回-1,找到就返回在模式串中的下标*/public static int kmpSearch(String str1,String str2,int[] next){for (int i=0,j=0;i<str1.length();i++){while ((str1.charAt(i)!=str2.charAt(j))&&j>0){//通过next数组找到前一个位置子串的最长公共前后缀的索引值j=next[j-1];}if (str1.charAt(i)==str2.charAt(j)){j++;//子串索引后移}if (j==str2.length()){return i-j+1;}}return -1;}
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言本身不难,难得是应用场景很多

你学了C语言多半是要做项目的&#xff0c;这个过程中C语言是远远不够的&#xff0c;你把这部分难度加到C语言上&#xff0c;自然就难了在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区…

【python】如何通过python来发送短信

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

MySQL-多表设计

黑马程序员JavaWeb开发教程 文章目录 一、一对多&#xff08;多对一&#xff09;二、一对一三、多对多 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xf…

【日志】CSDN-AI助手升级日志

CSDN-AI助手升级日志 2023/04/05上线 支持点赞、收藏回访 关注回访&#xff08;对方至少有一条博客的记录&#xff09; 评论回访 私信检测到群发消息自动三连 OR 通过私信指令三连触发 bug优化 优化检测模式&#xff0c;防止出现多触发情况 为了防止操作额度不够&#xff0c…

虚拟局域网PPTP配置与验证

虚拟局域网PPTP配置与验证 前言PPTP服务侧安装配置REF 前言 虚拟专用网&#xff08;Virtual Private Network&#xff0c;VPN&#xff09;是一种通过公共网络建立安全的连接的技术。它能够在不同的地理位置之间建立私密的通信通道&#xff0c;实现远程访问网络资源的安全性和隐…

2024.4.21周报

目录 摘要 Abstract 文献阅读&#xff1a;Next Item Recommendation with Self-Attentive Metric Learning 问题及方法 论文贡献 方法论 序列感知的推荐系统 神经注意模型 模型&#xff1a;ATTREC 序列推荐 基于Self-Attention的用户短期兴趣建模 用户长期兴趣建模…

JSS作业

JSS作业&#xff1a; 1: <script>var cnt parseInt(window.prompt("请输入打印的行数&#xff1a;"));for (var i 1; i < cnt; i){for (var j 1; j < i; j){document.write("*")}document.write("<br>")} </script>…

量化交易:多因子选股结合布林带择时

哈喽,大家好,我是木头左! 多因子选股策略是一种基于多个财务指标来筛选股票的方法。这种策略认为,通过综合考虑多个因素,可以更全面地评估一家公司的价值和盈利潜力。 感兴趣的朋友,可以在下方公号内回复:001,即可获取源码,共同交流! 策略的基本原理 在本策略中,我…

区块链 | OpenSea:Toward Achieving Anonymous NFT Trading 一文的改进方案

&#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading &#x1f951;吐槽&#xff1a; 这论文怎么老有描述不清、前后不一致的地方&#x1f607; 正文 在本节中&#xff0c;我们将具体展示我们方案的构建。我们将基于一个示例来描述我们方案的工作流程&…

【MongoDB】数据的自动过期,TTL索引

文章目录 1. 前言2.概念与使用2.1.使用方式2.2.数组中包含日期字段2.3.设置具体的过期时间点2.4.额外的过滤条件 3.总结 1. 前言 在近期的工作中&#xff0c;使用了MongoDB来保存了一些日志数据&#xff0c;但是这些日志数据具有一定的时效性&#xff0c;也就是按照业务的需要…

mac可以玩steam吗 mac安装steam教程 苹果电脑能打steam游戏吗 苹果电脑怎么安装windows 苹果mac电脑配置AI功能的M4芯片

众所周知&#xff0c;Steam作为一个热门的游戏平台&#xff0c;深受国内外玩家的喜爱&#xff0c;平台中包含了无数的游戏&#xff0c;在作战时玩家们能够与朋友们互动聊天&#xff0c;还能匹配好友组队&#xff0c;同时还能增进与同伴的默契度。 但是最近有玩家们提问说&#…

MySQL数据库中备份和查询

总所周知我们用到的数据有可能丢失&#xff0c;那么我们就可以通过备份把数据找回&#xff0c;如何操作&#xff1a;请先看下面讲解 备份&#xff1a; 导出&#xff1a; 先对数据库进行备份&#xff0c;然后提取备份文件中的SQL语句 这就是我们导出数据&#xff0c;导出了就有…

关于conda占C盘内存的问题

文章目录 前言一、C盘中.conda文件中的envs二、C盘中.conda文件中的pkgs 前言 最近发现C盘空间越来越少&#xff0c;于是就去清理了一下conda在C盘的存储&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;足足十几G&#xff01;于是去网上搜索了相关的包能不能删除&a…

.Net4.0 Web.config 配置实践

目录 关于 Web.config 运行环境 配置实践 请求验证模式兼容旧版本 上传文件限制 Request.Path危险值配置 全站应用UTF-8编码 设置日期格式 每个会话的限制并发请求数 正常运行指定扩展名的文件 Json字符串超出最大长度限制 控件早期版本的呈现方式 C# 操作 Web.co…

电梯节能的推广意义

之前关于电梯能量回馈设备&#xff0c;小伍已经做了很多介绍&#xff0c;那么小伙伴们&#xff0c;他的推广意义你真的了解了么&#xff1f; 第一&#xff1a;节电降耗&#xff0c;电梯在运行过程中会产生大量的惯性能量&#xff0c;这些能量如果不被利用就会浪费。能量回馈技术…

iframe和 blob实现JS,CSS,HTML直接当前页预览

先贴效果图&#xff1a; <template><div><div class"aaa"></div><div class"btn-run" click"tres">运行</div></div></template><script>import { mapState } from vuex;export default …

UDP文件传输工具之UDP怎么限流

UDP&#xff08;用户数据报协议&#xff09;以其低延迟和高速度的特点&#xff0c;在实时应用和大数据传输中扮演着重要角色。然而&#xff0c;UDP作为一种无连接的协议&#xff0c;并不保证数据包的顺序、完整性或可靠性。 因此&#xff0c;企业在寻求一种方式&#xff0c;有…

尝试给笔记本超频

超频&#xff08;英语&#xff1a;overclocking&#xff09;是把一个电子配件的时脉速度提升至高于厂方所定的速度运作&#xff0c;从而提升性能的方法&#xff0c;但此举有可能导致该配件稳定性以及配件寿命下降。 笔记本配置为&#xff1a; 处理器 AMD Ryzen 7 7730U wit…

【GlobalMapper精品教程】076:基于高程和影像数据创建电子沙盘(真实三维地形)

影像与数字高程模型叠加,可以构建三维真是地形。本文讲解在Globalmapper中基于高程和影像数据创建电子沙盘(真实三维地形)。 文章目录 一、加载数据二、创建三维网格三、三维叠加显示一、加载数据 本实验的数据(配套实验数据资料包中的data076.rar,订阅专栏,获取全文及数…

基于MLP算法实现交通流量预测

在浩如烟海的城市数据中&#xff0c;交通流量信息无疑是揭示城市运行脉络、洞察出行规律的关键要素之一。实时且精准的交通流量预测不仅能为交通规划者提供科学决策依据&#xff0c;助力提升道路使用效率、缓解交通拥堵&#xff0c;还能为公众出行提供参考&#xff0c;实现个性…