通俗易懂的KMP理论讲解(含手求Next数组)
通俗易懂的KMP理论讲解(含手求Next数组)
1.KMP算法介绍
KMP算法的核心是利用匹配失败后的信息,通过一个 next 数组,保存模式串中前后最长公共子序列的长度,尽量减少模式串与主串的匹配次数降低时间复杂度以达到快速匹配的目的。
2.字符串的前后缀与公共前后缀
2.1字符串的前缀
字符串的前缀是指不包含最后一个字符的所有以第一个字符(索引为0)开头的连续子串。
例:字符串“ABCD”的前缀有A,AB,ABC。
2.2字符串的后缀
字符串的后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。
例:字符串“ABCD”的后缀有BCD,CD,D。
2.3公共前后缀
公共前后缀是指一个字符串的所有前缀连续子串和所有后缀连续子串中相等的子串。
例:字符串“ABABA”
前缀有:A,AB,ABA,ABAB
后缀有:BABA,ABA,BA,A
因此公共前后缀有:A ,ABA
2.4最长公共前后缀
最长公共前后缀是指所有公共前后缀的长度最长的那个子串。
例如字符串 “ABABA” ,公共前后缀有:A ,ABA
ABA是三个字符长度,A是一个字符长度,那么最长公共前后缀就是ABA
3.手求Next数组
第一种方法(亲测好用):
示例:串“ababaa”的next数组为()。
解析:首先,搬出我们总结的真理:
串的第一位和第二位字符对应的next值分别为固定值0、1
串的其他位对应的next值为该字符之前的字符串的公共最长匹配前缀和后缀的长度加1
※对于从索引为0开始的子串“ab”而言:
前缀:不包含最后一个字符b的所有以第一个字符a开头的连续子串有a。
后缀:不包含第一个字符a的所有以最后一个字符b结尾的连续子串有b。
因此该子串的最长公共前后缀的长度为0然后将该值进行+1操作得到对应的next值为1。
※对于从索引为0开始的子串“aba”而言:
前缀:不包含最后一个字符a的所有以第一个字符a开头的连续子串有a,ab。
后缀:不包含第一个字符a的所有以最后一个字符a结尾的连续子串有ba,a。
因此该子串的最长公共前后缀长度为1然后将该值进行+1操作得到对应的next值为2。
※对于从索引为0开始的子串“abab”而言:
前缀:不包含最后一个字符b的所有以第一个字符a开头的连续子串有aba,ab,a。
后缀:不包含第一个字符a的所有以最后一个字符b结尾的连续子串有bab,ab,b。
因此该子串的最长公共前后缀长度为2然后将该值进行+1操作得到对应的next值为3。
※对于从索引为0开始的子串“ababa”而言:
前缀:不包含最后一个字符a的所有以第一个字符a开头的连续子串有abab,aba,ab,a。
后缀:不包含第一个字符a的所有以最后一个字符a结尾的连续子串有baba,aba,ba,a。
因此该子串的最长公共前后缀为3然后将该值进行+1操作得到对应的next值为4。
所以串“ababaa”的next数组为:011234
第二种方法(网上看到的,本人还不是很理解,有懂的人可以说一下):
--------------------------------------------------------------------------分隔线-----------------------------------------------------------------------------
以下部分转载自知乎作者:Nick
链接:https://www.zhihu.com/question/62030859/answer/835271234
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
示例:求串“a b a a b c a c”的next数组。
这是一个考试常见的字符串,是如何计算的那?第n位:next[n]的值来自于第n-1位的字符,通过跟第next[n-1]位字符比较,如果相同next[n]=next[n-1]+1,如果不相同,就跟第next[next[n-1]]位的字符比较,就这样迭代直到相同的时候,加上1,如果实在没有,就为1.这一段话可能很难理解,逐位分析。让我们从依次来看:第3位:第2位和第1位比较,不相同 所以为1第4位:第3位和第1位比较,相同,所以为2第5位:第4位和第2位比较,不相同,和第1位比较,相同,所以为2第6位:第5位和第2位比较, 相同,所以为3第7位:第6位和第3位比较,不同,和第1位比较,不同,所以为1第8位:第7位和第1位比较,相同,所以为2.
-------------------------------------------------------------------------分隔线-------------------------------------------------------------------------------
需要打印的可以通过链接下载文档文件:https://www.lanzouw.com/iGIM21tlx49i
创作不易,点赞关注一下吧。
通俗易懂的KMP理论讲解(含手求Next数组)的更多相关文章
- 串的应用与kmp算法讲解--学习笔记
串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...
- 算法-最通俗易懂的KMP算法详解
有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍.但KMP算法真的不适合这样去学.最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉.我试 ...
- 关于KMP中求next数组的思考【转】
文章转自 http://www.tuicool.com/articles/yayeIbe.这是我看到关于求next数组,解释最好的一篇文章!!!!!!! KMP的next数组求法是很不容易搞清楚的一部 ...
- KMP算法中求next数组的实质
在串匹配模式中,KMP算法较蛮力法是高效的算法,我觉得其中最重要的一点就是求next数组: 看了很多资料才弄明白求next数组是怎么求的,我发现我的忘性真的比记性大很多,每次看到KMP算法求next数 ...
- SNF快速开发平台2019-角色、权限、账户的概念理解-非常全的理论讲解权限控制
组织模型 资源模型 操作模型 谁能够执行哪些操作 执行资源的范围 资源概念资源就是想要的到的最终物质,我们可以给每一个资源定义一个权限,也可以给某一类资源定义一个权限 权限概念权限是对资源 ...
- 对于kmp求next数组的理解
首先附上代码 1 void GetNext(char* p,int next[]) 2 { 3 int pLen = strlen(p); 4 next[0] = -1; 5 int k = -1; ...
- Java后缀数组-求sa数组
后缀数组的一些基本概念请自行百度,简单来说后缀数组就是一个字符串所有后缀大小排序后的一个集合,然后我们根据后缀数组的一些性质就可以实现各种需求. public class MySuffixArrayT ...
- 字符串匹配之KMP算法(续)---还原next数组
相信通过今天的文章,你会对KMP的认识更加深入一层,不止停留在知道怎样计算的层面上了,废话不多说,開始. 通过前面的第一篇文章,知道了怎么求next数组,相信非常多喜欢刨根问底的人就会问,我依照你的做 ...
- 求一个数组中最小的K个数
方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如 ...
- 编写函数求整形数组a中存储的m个不重复的整数的第k大的整数(其中m>=1,1<=k<=m)很简单的一个思路是酱紫的:管他辣么多干啥,上来一把排序然后直接得答案
/** * @author:(LiberHome) * @date:Created in 2019/2/28 20:38 * @description: * @version:$ *//*编写函数求整 ...
随机推荐
- KingbaseES 使用sys_bulkload远程导入
前言 sys_bulkload 常见场景是本地导入数据,也可以在远程运行 sys_bulkload ,对数据库上的CSV 文件进行导入.远程导入数据时候需要注意,csv文件和ctl文件所在服务器.以下 ...
- 手写数字图片识别——DL 入门案例
Deep Learning Demo of Primary 下面介绍一个入门案例,如何使用TensorFlow和Keras构建一个CNN模型进行手写数字识别,以及如何使用该模型对自己的图像进行预测.尽 ...
- #分块,二分#洛谷 5356 [Ynoi2017] 由乃打扑克
题目 支持区间加和区间查询第 \(k\) 小 分析 分块之后给每个整块排序,这样修改的时候整块打标记,散块直接分开把需要加的部分暴力加之后归并,就是 \(O(\sqrt{n})\) 的 查询的话,如果 ...
- vue3中的样式为什么加上scoped不生效
<style>标签添加scoped属性时,Vue会自动为该组件内的所有元素添加一个独特的数据属性,例如data-v-f3f3eg9.同时,它也会修改你的CSS选择器,使得它们只匹配带有这个 ...
- OpenHarmony父子组件单项同步使用:@Prop装饰器
@Prop装饰的变量可以和父组件建立单向的同步关系.@Prop装饰的变量是可变的,但是变化不会同步回其父组件. 说明: 从API version 9开始,该装饰器支持在ArkTS卡片中使用. 概述 ...
- 大奖升级!HMS Core线上Codelabs挑战赛第3期:用3D建模构建元宇宙
"元宇宙"概念风生水起,在AR.VR等技术构建的虚拟世界里,3D模型担当重要角色,无论是为玩家提供更丰富更真实游戏体验的3D游戏领域,还是各大电商平台正在启用并不断完善的3D虚拟购 ...
- 成像光谱遥感技术中的AI革命:ChatGPT在遥感领域中的应用
遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理.化学和生物系统的基石.ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力.重点 ...
- HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力
一. 样例介绍 本篇Codelab基于自适应布局和响应式布局,实现购物应用在手机.折叠屏.平板不同屏幕尺寸设备上按不同设计显示.通过三层工程结构组织代码,实现一次开发,多端部署 . 手机运行效果如图所 ...
- 面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这
写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题,正好我们最近也在梳理学习AQS(抽象队列同步器),而CountDownLatch又是其中典型的代表,我们今天就继续来学一下这 ...
- 重新点亮linux 命令树————screen 命令和系统日志[二十四]
前言 简单介绍一下screen 正文 因为我们终端关闭后,终端就消失了,故而希望有终端保持. 1.yum install screen 进行安装. 2.使用screen 进行进入 3.然后打开tail ...