KMP算法详细理解

news2024/11/24 8:47:14

一、目的

1.KMP应用场景:可以解决字符串匹配问题; 在一个串中查找是否出现过另一个串。

2.KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。

3.KMP算法关键在于:在当前对文本串和模式串检索的过程中,若出现了不匹配,如何充分利用已经匹配的部分。

4.理解KMP需要搞懂的几个方面:

  • 什么是前缀表?为什么一定要用前缀表?如何计算前缀表

  • 前缀表与next数组关系?构造next数组的几种方法?

  • 如何使用next数组来做匹配

二、理解过程

1.例子:用模式串去匹配文本串

(1)暴力破解:O(m+n)

(2)KMP算法:先进行常规匹配,到b和f不相等时,会直接将f移动到b的位置来匹配(因为b前面的两个a已经匹配好了),直至匹配完成。

2.前缀表:用来回退的,它记录了模式串与主串(文本串)不匹配时,模式串应该从哪里开始重新匹配。

(1)学会找最长相等前后缀(关键!!)

(2)前缀:包含首字母,不包含尾字母的所有子串

eg.例子里的前缀有a,aa,aab,aaba,aabaa。 aabaaf就不是前缀即不可以包含尾字母

同理后缀:f.af.aaf.baaf.abaaf

(3)什么是最长相等前后缀?

答:前缀=后缀且最长

过程:找模式串的最长相等前后缀也就是前缀表,利用前缀找最长相等前后缀:

a 0 (a既是前缀又是后缀,所以为0)

aa 1 (前一个a是前缀,后一个a是后缀,且都是a,则长度为1)

aab 0 (前缀有a,aa,后缀有b,ab,整个来讲找的就是前缀的前缀,前缀的后缀)

aaba 1 (第一个a和b后的a相等)

aabaa 2 (第一个a和最后的a;前aa和后aa)

aabaaf 0

从而得到前缀表为:010120

从图中可知,从第一个a开始匹配,发现到模式串f时匹配不成功,随即立马找f之前的串即aabaa的最长相等前后缀,也就是2,所以就从模式串位置2即第三个数开始重新匹配.

3.next数组:可以理解就是前缀表,但next数组写法很多

(1)其他写法

原始 0 1 0 1 2 0

整体右移 -1 0 1 0 1 2

整体减1 -1 0 -1 0 1 -1

但这里还是用原始的进行操作和编码

4.代码实现(也就是找最长相等前后缀的过程):

步骤:(1)初始化next数组和变量(2)处理前后缀不同的情况(3)处理前后缀相同的情况

(4)更新next

i代表后缀末尾; j指向前缀末尾,也代表包括i之前的最长相等前后缀的长度; 下面是代码和运行过程图

代码是伪代码,不完整:

public void getnext(int[] next, String s){
// 初始化j next;
j = 0, next[0] = j,
for(i = 1; i<s.length();i++){// 注意i从1开始,这样才能和j比较

    //前后缀不相同:j 遇到冲突就回退;
    //用while而不是if原因在于若不匹配,一直往前退到0或匹配为止,是个连续的过程;
    //j>0因为j的起始位置为0,再回退就越界了;
    while(j > 0 && s[i]!=s[j] ){
        j = next[j-1];  }// 向前回溯,回溯前一位的next中的位置

    //前后缀相同  
    if(s[i]==s[j])   j++;  最长相等前后缀长度加1
    next[i] = j;  }//将j(前缀的长度)赋给next【i】,不管前后缀是否相同,都要存放
    

例题实现strStr() ①先对模式串进行kmp,得到next数组即前缀表

②将文本串和模式串进行匹配,使用next数组保存的最长相等前后缀辅助。

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

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

相关文章

NTP同步时钟为医院提供标准的时间信号

NTP同步时钟应用于城市重要公共领域&#xff0c;如车站、学校、医院、等。NTP同步时钟可提供准确的公众时间&#xff0c;为人们的日常生活提供便利&#xff0c;避免了因时钟不准确而带来的不便。NTP同步时钟采用智能模块化设计&#xff0c;与同类产品相比&#xff0c;更突出了安…

LoRaWAN的网络协议是怎样的?有哪些应用?

LoRaWAN是一种低功耗广域物联网协议&#xff0c;其网络结构包括三个主要组件&#xff1a;终端设备&#xff08;End Device&#xff09;、网关&#xff08;Gateway&#xff09;和网络服务器&#xff08;Network Server&#xff09;。终端设备通常是一些低功耗设备&#xff0c;例…

LeetCode 206. 反转链表

LeetCode 206. 反转链表 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 给你单链表的头节点 headheadhead &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&a…

51. N 皇后 (Swift 版本)

题目 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 …

2023年Java进阶架构师的必备思维导图,让你少走弯路!

架构师是什么&#xff1f;要做什么&#xff1f; 架构师 &#xff1a;是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。架构师不是一个人&#xff0c;他需要建立高效的体系&#xff0c;带领团队去攻城略地&#xff0c;在规定的时间内…

nodejs基于vue社区失物招领+房屋租赁+停车+宠物互助平台

1、一般用户的功能及权限 所谓一般用户就是指还没有注册的过客,他们可以浏览主页面上的信息。但如果有中意的社区互助信息时&#xff0c;要登录注册&#xff0c;只有注册成功才有的权限。 2、管理员的功能及权限 用户信息的添加和管理&#xff0c;社区互助详细信息添加和管理和…

【机器学习】生成式模型和判别式模型

在机器学习中&#xff0c;对于有监督学习可以将其分为两类模型&#xff1a;判别式模型和生成式模型。判别式模型是针对条件分布建模&#xff0c;而生成式模型则针对联合分布进行建模。 1.抛砖引玉 假设有训练数据(X,Y)&#xff0c;X是属性集合&#xff0c;Y是类别标记。这时来了…

【十】深入理解redolog,undolog和binlog的底层原理

MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/124552080【三】深入理解mysql的索引分类&a…

Java进击框架:Spring(一)

Java进击框架&#xff1a;Spring&#xff08;一&#xff09;前言创建Spring项目Spring IoC容器和Beans介绍Bean的概述Spring IoC配置元数据实例化Bean依赖注入循环依赖详细配置生命周期回调Bean定义继承基于注解的容器配置Component和进一步的原型注解自动检测类和注册Bean定义…

Qt 第1课、Qt 的窗口组件和窗口类型

GUI 程序的开发原理&#xff1a; GUI 程序在运行的时候&#xff0c;操作系统会为它创造一个消息队列&#xff0c;消息队列用于存储操作系统发过来的系统消息。 用户使用操作系统的过程中&#xff0c;操作系统内核检测到用户的操作&#xff08;鼠标&#xff0c;键盘&#xff09…

[数据结构]时间复杂度与空间复杂度

[数据结构]时间复杂度与空间复杂度 如何衡量一个算法的好坏 long long Fib(int N) {if(N < 3)return 1;return Fib(N-1) Fib(N-2); } 这是一个求斐波那契数列的函数&#xff0c;使用递归的方法求得&#xff0c;虽然代码看起来很简洁&#xff0c;但是简洁真的就好吗&#…

Apache Hadoop生态部署-zookeeper单机安装

目录 查看服务架构图-服务分布、版本信息 一&#xff1a;安装前准备 1&#xff1a;zookeeper安装包选择--官网下载 2&#xff1a;zookeeper3.5.7安装包--百度网盘 二&#xff1a;安装与常用配置 2.1&#xff1a;下载解压zk安装包 2.2&#xff1a;配置修改 2.3&#xff1…

Codeforces Round #848 (Div. 2)(A~D)

A. Flip Flop Sum给出一个只有1和-1的数组&#xff0c;修改一对相邻的数&#xff0c;将它们变为对应的相反数&#xff0c;修改完后数组的和最大是多少。思路&#xff1a;最优的情况是修改一对-1&#xff0c;其次是一个1一个-1&#xff0c;否则修改两个1。AC Code&#xff1a;#i…

订单超时自动取消的 3 种解决方案,yyds!

大家对电商购物应该都比较熟悉了&#xff0c;我们应该注意到&#xff0c;在下单之后&#xff0c;通常会有一个倒计时&#xff0c;如果超过支付时间&#xff0c;订单就会被自动取消。下单今天&#xff0c;我们来聊聊订单超时未支付自动取消的几种方案。1.定时任务这是最容易想到…

啥是原神?女友说想要全角色语音+表情包,顺手用python把高清图也整下来了

原神全角色中日语音表情包高清图人生苦短 我用python表情包部分&#xff1a;1. 素材来自&#xff1a;2. 准备模块3. 调用浏览器驱动4. 页面滚动5. 保存数据5. 效果全角色语音高清彩图部分1.准备工具2. 准备模块3. 请求链接4. 本次目标5. 分析数据来源6. 开始代码7. 执行结果8. …

云原生丨一文教你基于Debezium与Kafka构建数据同步迁移(建议收藏)

文章目录前言一、安装部署Debezium架构部署示意图安装部署二、数据迁移Postgres迁移到PostgresMySQL迁移到PostgresSQL前言 在项目中&#xff0c;我们遇到已有数据库现存有大量数据&#xff0c;但需要将全部现存数据同步迁移到新的数据库中&#xff0c;我们应该如何处理呢&…

基于追踪标记的WAF设计思路

一 相关背景 目前&#xff0c;市面上的WAF产品通常采用”发现即阻断“的策略&#xff0c;以防护针对业务系统的Web攻击行为。虽然该策略可及时阻断攻击&#xff0c;但形式上过于简单&#xff0c;并不能有效掌握攻击者进一步的攻击意图&#xff0c;也不能有效提高攻击者的成本投…

【数据结构】时间复杂度

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对…

关于数据分析和数据指标,企业还需要做什么?

数据虽然已经成为了各行各业对未来的共识&#xff0c;也切实成为了各领域企业的重要资产。但真正谈到发挥数据的价值&#xff0c;就必须从规模庞大的数据中找出需求的数据&#xff0c;然后进行利用。这个过程光是想想就知道很麻烦&#xff0c;更别提很多数据都是经常会用到的&a…

【STL】模拟实现vector

目录 1、基本成员变量 2、默认成员函数 构造函数 析构函数 拷贝构造函数 赋值运算符重载函数 3、容器访问相关函数接口 operator [ ]运算符重载 迭代器 范围for 4、vector容量和大小相关函数 size和capacity reserve扩容 resize swap交换数据 empty 5、修…