通俗易懂的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数组)的更多相关文章

  1. 串的应用与kmp算法讲解--学习笔记

    串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...

  2. 算法-最通俗易懂的KMP算法详解

    有些算法,适合从它产生的动机,如何设计与解决问题这样正向地去介绍.但KMP算法真的不适合这样去学.最好的办法是先搞清楚它所用的数据结构是什么,再搞清楚怎么用,最后为什么的问题就会有恍然大悟的感觉.我试 ...

  3. 关于KMP中求next数组的思考【转】

    文章转自 http://www.tuicool.com/articles/yayeIbe.这是我看到关于求next数组,解释最好的一篇文章!!!!!!! KMP的next数组求法是很不容易搞清楚的一部 ...

  4. KMP算法中求next数组的实质

    在串匹配模式中,KMP算法较蛮力法是高效的算法,我觉得其中最重要的一点就是求next数组: 看了很多资料才弄明白求next数组是怎么求的,我发现我的忘性真的比记性大很多,每次看到KMP算法求next数 ...

  5. SNF快速开发平台2019-角色、权限、账户的概念理解-非常全的理论讲解权限控制

    组织模型   资源模型  操作模型 谁能够执行哪些操作    执行资源的范围 资源概念资源就是想要的到的最终物质,我们可以给每一个资源定义一个权限,也可以给某一类资源定义一个权限 权限概念权限是对资源 ...

  6. 对于kmp求next数组的理解

    首先附上代码 1 void GetNext(char* p,int next[]) 2 { 3 int pLen = strlen(p); 4 next[0] = -1; 5 int k = -1; ...

  7. Java后缀数组-求sa数组

    后缀数组的一些基本概念请自行百度,简单来说后缀数组就是一个字符串所有后缀大小排序后的一个集合,然后我们根据后缀数组的一些性质就可以实现各种需求. public class MySuffixArrayT ...

  8. 字符串匹配之KMP算法(续)---还原next数组

    相信通过今天的文章,你会对KMP的认识更加深入一层,不止停留在知道怎样计算的层面上了,废话不多说,開始. 通过前面的第一篇文章,知道了怎么求next数组,相信非常多喜欢刨根问底的人就会问,我依照你的做 ...

  9. 求一个数组中最小的K个数

    方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如 ...

  10. 编写函数求整形数组a中存储的m个不重复的整数的第k大的整数(其中m>=1,1<=k<=m)很简单的一个思路是酱紫的:管他辣么多干啥,上来一把排序然后直接得答案

    /** * @author:(LiberHome) * @date:Created in 2019/2/28 20:38 * @description: * @version:$ *//*编写函数求整 ...

随机推荐

  1. 揭秘镭速传输点对点传输技术,NAT+Raysync强强组合

    点对点传输是一种文件即时传输方式用于实现数据的快速联动,为所有客户端提供资源,包括带宽.存储空间.计算能力.点对点传输技术有很多应用,包括共享各种格式音频.视频.数据等. 在5G重新定义带宽,信息技术 ...

  2. 为什么医疗保健需要MFT来帮助保护EHR文件传输

    毫无疑问,医疗保健行业需要EHR技术来处理患者,设施,提供者等之间的敏感患者信息.但是,如果没有安全的MFT解决方案,您将无法安全地传输患者文件,从而使您的运营面临遭受数据泄露,尴尬,声誉损失以及随之 ...

  3. KingbaseES V8R6 运维案例之---数据库连接访问故障分析

    KingbaseES V8R6运维案例之---数据库连接访问故障分析 案例说明: 在部署KingbaseES V8R6后,正常启动数据库服务,但是通过ksql连接数据库服务访问时,出现连接到postg ...

  4. KingbaseES V8R6 索引膨胀

    索引膨胀 对于索引,随着业务不断的增删改,会造成膨胀,尤其Btree索引,也会涉及索引分裂.合并等,导致索引访问效率降低.维护成本增加.另外,索引页的复用与HEAP PAGE不一样,因为索引的内容是有 ...

  5. JS实现决策报表缓存最后一次查询条件

    问题描述 决策报表在打开时希望参数控件的值可以默认是上一次页面关闭前最后一次查询所选择的值. 解决方案 每次点击查询后将参数值保存到浏览器缓存中(适用于控件在参数栏内),或每次控件值发生改变后将参数值 ...

  6. 在idea/webstorm等terminal运行命令报错:Command rejected by the operating system没有权限【已解决】

    在idea/webstorm等编译器terminal窗口运行命令报错:Command rejected by the operating system没有权限[已解决] 1.修改terminal窗口 ...

  7. Jenkins设置定时触发器执行任务

    1. 选中任务,选择配置/构建触发器,选择定时构建 2. 填写定时器参数,格式说明如下,共五个参数,参数之间空格隔开,不需要填的直接*号即可.  此处d定时任务的格式遵循 cron 的语法(可以与 c ...

  8. #ST表,单调栈#洛谷 5648 Mivik的神力

    题目 分析 考虑答案应该是一段单调不下降的序列, 考虑预处理出每个点往后第一个大于这个点的位置, 那么答案应该是左端点到区间内最大的位置以及这个位置到右端点的贡献 那么区间最大的位置可以用ST表做,然 ...

  9. OpenHarmony使用ArkUI Inspector分析布局

      本文转载自<#2023 盲盒+码 # OpenHarmony使用ArkUI Inspector分析布局>,作者:zhushangyuan_ OpenHarmony使用ArkUI Ins ...

  10. 直播预告丨OpenHarmony标准系统多媒体子系统之音频解读

    今晚19点,OpenHarmony开源开发者成长计划知识赋能第五期"掌握OpenHarmony多媒体的框架原理"的第四节直播课,即将开播! 深开鸿资深技术专家苑春鸽老师,将在Ope ...