首页 > 其他分享 >通俗易懂的KMP理论讲解(含手求Next数组)

通俗易懂的KMP理论讲解(含手求Next数组)

时间:2024-04-13 15:23:58浏览次数:25  
标签:子串 字符 前缀 后缀 公共 Next 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

创作不易,点赞关注一下吧。

标签:子串,字符,前缀,后缀,公共,Next,KMP,next,含手求
From: https://www.cnblogs.com/chunyublog/p/18132885

相关文章

  • nextJs中使用styled-jsx
    NextJs不支持直接在页面和组件里importCss这种引入方式(除了全局引入),但是可以使用styled-jsx的方式进行Css的样式定义,也可以实现样式加载NextJs中Css的几种使用方案: global全局引入:在main文件或者app.js/ts文件里面进行全局引入,这种只是适合全局作用的样式引入。例如:im......
  • KMP算法
    前言KMP算法:用于寻找s串中是否包含a串算法思路思路:暴力解法中使用(i,j)......
  • ABP-VNext 用户权限管理系统实战04---多数据库支持、批量插入
    系统用的.net core,数据库映射工具为efcore,可以支持多数据库。一、支持多数据库1、扩展AbpDbContextOptions类 需要引入的类 2、服务中注入 二、批量插入实现EFCORE批量插入接口IEfCoreBulkOperationProvider,使用杨中科的包:https://github.com/yangzhongke/Zack.EF......
  • HarmonyOS NEXT应用开发—Navigation开发 页面切换场景范例
    简介在应用开发时,我们常常遇到,需要在应用内多页面跳转场景时中使用Navigation导航组件做统一的页面跳转管理,它提供了一系列属性方法来设置页面的标题栏、工具栏以及菜单栏的各种展示样式。除此之外还拥有动态加载,navPathStack路由跳转。本文就以Navigation页面切换范例为例,来展......
  • 探秘KMP算法:解密字符串匹配的黑科技
    KMP算法在正式进入KMP算法之前,不得不先引经据典一番,因为直接去理解KMP,你可能会很痛苦(别问,问就是我也痛苦过)。所以做好前面的预热工作非常非常重要,为了搞明白KMP,在没见到KMP算法的完整代码之前,请耐心的将前面的东西看完。一些相关的概念学习KMP算法,得明白它主要得作用......
  • Vue.nextTick() 使用场景及实现原理
    Vue.nextTick()基本使用作用:等待下一次DOM更新刷新的工具方法。为什么需要用到Vue.nextTick()?当你在Vue中更改响应式状态时,最终的DOM更新并不是同步生效的,而是由Vue将它们缓存在一个队列中,直到下一个“tick”才一起执行。这样是为了确保每个组件无论发生多少......
  • sql server 分页语句OFFSET 和 FETCH NEXT 怎样使用?
    原文链接:https://blog.csdn.net/weixin_45659376/article/details/107336143在SqlServer2012之前,实现分页主要是使用ROW_NUMBER(),在SQLServer2012,可以使用Offset...RowsFetchNext...Rowsonly的方式去实现分页数据查询。在OrderBy子句中新增Offset-Fetch子句,用于从有......
  • nextjs 的函数,参数,属性装饰器的使用
    //属性装饰器constdoc1:PropertyDecorator=(target:any,val:string|symbol)=>{console.log(target);console.log(val);val="覆盖";}//方法装饰器constdoc2:MethodDecorator=(target:any,val:string|symbol,desc:any)=>{cons......
  • AGC008E Next or Nextnext 解题报告
    \(\text{分析}\)\(i\toa_i\)构成内向基环树,配合暴力程序观察内向基环树常见的一些特殊情况:灰色笔对应的是\(i\toa_i\),黑色笔对应的是\(i\top_i\),我们相当于要构造一个黑色的排列(若干环)使得每一条灰色边的起点可以通过一条或两条黑色边到达终点。\(a_i=i\)(全是自环):可以任......
  • ENSP通过 ISAKMP 方式建立 IPsec 隧道(采用证书认证)更新中
    第一步:证书准备cd/etc/pki/CAopensslreq-newkeyrsa:2048-x509-days365-out//CN-HN-SY-SYZY-XXJS-CA_ROOT(剩下的都按回车)cacert.pem-keyoutcakey.pemmvcakey.pemprivate/cd~/certsopensslreq-newkeyrsa:2048-new-outr1csr.csr-keyoutr1key.pem/......