KMP算法模式匹配——手工求解next和nextval数组值

news2025/2/24 8:25:54

本文需要了解KMP算法基本流程和相关概念,如有问题,请先进行基础学习:链接: 天勤-KMP算法易懂版

求解next数组值

给定模式串:“ababaaab”,求解其next数组值。
例子里面的ababaaab,我们定义一个 i 为模式串的下标(从1开始),我们把 i 所指字符之前的串记为F(不包括i所指的字符),手推如下:

  1. i = 1 时,此时指向a,发生不匹配,此时属于模式串的第一个字符与主串对应位置不匹配,应从主串的下一位置和模式串的第一个字符继续比较。那么此时,我们也将 next[1] 赋值为 0 来表示这种情况。
  2. i = 2 时,此时指向b,发生不匹配,可知F为"a",此时属于不存在前后重合的部分,应该从主串中发生不匹配的字符与模式串第一个字符开始比较。我们可以把这种情况的最长相等前后缀的长度看为0,那么next[2]赋值为1
  3. i = 3 时,此时指向a,发生不匹配,此时可以知道F是"ab",与2中情况一样,则next[3]为1
  4. i = 4 时,此时指向b,发生不匹配,此时F为"aba",那么最长相等前后缀就为"a",长度为1,所以此时next[4]为2
  5. i = 5 时,此时指向a,发生不匹配,此时F为"abab",则最长相等前后缀为"ab",长度为2,故next[5]为3
  6. i = 6 时,此时指向a,发生不匹配,此时F为"ababa"最长相等前后缀为"aba",长度为3,则next[6]为4
  7. i = 7 时,此时指向a,发生不匹配,此时F为"ababaa"最长相等前后缀是"a",长度为1,则next[7]为2
  8. i = 8 时,此时指向b,发生不匹配,此时F为"ababaaa"最长相等前后缀是"a",长度为1,则next[8]为2

综上,可以得出next数组值为 0 1 1 2 3 4 2 2

求解nextval数组值

给定模式串:“ababaaab”,求解其nextval数组值。
例子里面的ababaaab,我们定义一个 j 为模式串的下标(从1开始),设next数组里面的值为pj(j为下标)
在这里插入图片描述

一般步骤(j,k均为下标):
1.当 j 等于1时,nextval[j]赋值为0,作为特殊标记。
2.当pj不等于pk时(k等于next[j]),nextval[j]赋值为k。
3.当pj等于pk时(k等于next[j]),nextval[j]赋值为nextval[k]。

手推如下:

n e x t v a l [ 1 ] = 0 , 特殊标记 nextval[1] = 0 ,特殊标记 nextval[1]=0,特殊标记
p 2 为 b , p n e x t [ 2 ] 为 a ,两者不相等, n e x t v a l [ 2 ] = n e x t [ 2 ] = 1 ; p2为b,p_{next\left[ 2\right] }为a,两者不相等,nextval[2]=next[2]=1; p2bpnext[2]a,两者不相等,nextval[2]=next[2]=1;
p 3 为 a , p n e x t [ 3 ] 为 a ,两者相等, n e x t v a l [ 3 ] = n e x t v a l [ n e x t [ 3 ] ] = 0 ; p3为a,p_{next\left[ 3\right] }为a,两者相等,nextval[3]=nextval[next[3]]=0; p3apnext[3]a,两者相等,nextval[3]=nextval[next[3]]=0;
p 4 为 b , p n e x t [ 4 ] 为 b ,两者相等, n e x t v a l [ 4 ] = n e x t v a l [ n e x t [ 4 ] ] = 1 ; p4为b,p_{next\left[ 4\right] }为b,两者相等,nextval[4]=nextval[next[4]]=1; p4bpnext[4]b,两者相等,nextval[4]=nextval[next[4]]=1;
p 5 为 a , p n e x t [ 5 ] 为 a ,两者相等, n e x t v a l [ 5 ] = n e x t v a l [ n e x t [ 5 ] ] = 0 ; p5为a,p_{next\left[ 5\right] }为a,两者相等,nextval[5]=nextval[next[5]]=0; p5apnext[5]a,两者相等,nextval[5]=nextval[next[5]]=0;
p 6 为 a , p n e x t [ 6 ] 为 b ,两者不相等, n e x t v a l [ 6 ] = n e x t [ 6 ] = 4 ; p6为a,p_{next\left[ 6\right] }为b,两者不相等,nextval[6]=next[6]=4; p6apnext[6]b,两者不相等,nextval[6]=next[6]=4;
p 7 为 a , p n e x t [ 7 ] 为 b ,两者不相等, n e x t v a l [ 7 ] = n e x t [ 7 ] = 2 ; p7为a,p_{next\left[ 7\right] }为b,两者不相等,nextval[7]=next[7]=2; p7apnext[7]b,两者不相等,nextval[7]=next[7]=2;
p 8 为 b , p n e x t [ 8 ] 为 b ,两者相等, n e x t v a l [ 8 ] = n e x t v a l [ n e x t [ 8 ] ] = 1 ; p8为b,p_{next\left[ 8\right] }为b,两者相等,nextval[8]=nextval[next[8]]=1; p8bpnext[8]b,两者相等,nextval[8]=nextval[next[8]]=1;

综上,nextval数组值为0 1 0 1 0 4 2 1

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

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

相关文章

【微服务】Nacos Discovery--服务治理

Nacos Discovery--服务治理前言服务治理常见的注册中心ZookeeperEurekaConsulNacosNacos 入门搭建nacos环境将商品微服务注册到nacos将订单微服务注册到nacos总结前言 上一章中,我们利用用户–订单–商品,实现了三个简单的微服务,实现了微服…

如何寻找计算机领域的英文文献?

大家一定或多或少都有文献检索的经验吧,中文文献还好,我们总归是对自己的的母语比较熟悉,通过关键词或其他检索条件,总能得心应手地找到自己需要的文献。相较于中文文献,对外文文献的检索就显得难度增加了不少&#xf…

pthread_create创建线程失败问题排查

一些基础概念的了解 Android中线程(Thread)的创建及内存分配过程分析 pthread_create创建线程失败的OOM详解 不可思议的OOM 通过上面的文章,我们知道为什么会报pthread_create错误 在创建线程的时候,报的下面这些错误&#xff0…

SAP采购订单中的净价是单价还是总价?

在采购订单中习惯上我们把订单项目的的净价理解为什么?单价还是总价? 先不着急回答。看看以下两个采购订单的对比截图就能了解, 在4050004000这笔采购订单中,采购10件黄色箱子,每10件500元。所以,净价500…

《JavaSE-第十七章》之LinkedList

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 刷题求职神器 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水…

Python Excel导入Mysql的通用方法

文章目录一、前言二、实现一、前言 此代码将导入部分尽量通用,仅配置下面两项就可以进行导入了: 从哪个excel导入到哪个mysql表 在程序中配置 他们之间的字段如何对应 写在mysql表中 ps:id,create_time,update_tim…

基于IDEA创建SpringBoot项目并进行入门分析

基于IDEA创建SpringBoot项目并进行入门分析 文章目录基于IDEA创建SpringBoot项目并进行入门分析SpringBoot 项目创建创建Module项目结构分析SpringBoot 项目启动分析启动入口启动过程概要分析SpringBoot 快速入门分析业务描述API设计分析代码编写及运行运行过程中的BUG分析Spri…

单商户商城系统功能拆解26—营销中心—限时秒杀

单商户商城系统,也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法,例如拼团,秒杀,砍价,包邮…

数电学习(六、时序逻辑电路)(三)

文章目录时序逻辑电路的设计方法同步时序逻辑电路的设计方法一般步骤改进步骤例:蚂蚁走迷宫背景分析继续编码状态,然后写出状态图,然后卡诺图化简,得到方程设计总结时序逻辑电路的设计方法 同步时序逻辑电路的设计方法 一般步骤…

2022最新SpringCloud面试题附完整答案

一、选择题 1.启动Ribbon的类注解是: ( ) A RibbonClient B EnableClient C EnableDisscoveryClient D Ribbon 2.下面哪个注解不是SpringbootApplication包含的默认属性值:( ) A: Configuration B: EnableAutoConfiguration C: ComponentSc…

【LINUX】Linux最常用的20个基本指令 介绍~分析

什么是 Linux ​ Linux 是一款基于 GNU 通用公共许可协议 的 自由和开放源代码 的类UNIX操作系统,该操作系统的内核由 Linus Torvalds 在1991年首次发布。之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。 但是,严格来…

springboot充电桩综合管理系统

目录 1 绪论 1 1.1 课题背景 1 1.2 课题研究现状 1 1.3 初步设计方法与实施方案 2 1.4 本文研究内容 2 2 系统开发环境 4 2.1 Java技术 4 2.2 JSP技术 4 2.3 B/S模式 4 2.4 MyEclipse环境配置 5 2.5 MySQL环境配置 5 2.6 SSM框架 6 3 系统分析 7 3.1 系统可行性分析 7 3.1.1 经…

基于 BP 神经网络特征提取的指纹识别应用(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…

【每日训练】排序子序列

目录 题目链接: 输入输出描述&&测试用例: 解析: 程序: 题目链接: 排序子序列_牛客笔试题_牛客网 (nowcoder.com) 输入输出描述&&测试用例: 测试用例: 输入: 6 1…

设计模式之美总结(重构篇)

title: 设计模式之美总结(重构篇) date: 2022-10-27 17:31:42 tags: 设计模式 categories:技术书籍及课程 cover: https://cover.png feature: false 文章目录1. 概述1.1 重构的目的:为什么要重构(why)?1.…

10月业务安全月报 | 美国将奇虎360和知道创宇列入黑名单;丰田泄露30万用户信息;苹果曝严重漏洞

导语:随着数字化的深入普及,业务愈加开放互联。企业的关键数据、用户信息、基础设施、运营过程等均处于边界模糊且日益开放的环境中,涉及利益流和高附加值的业务面临多样的安全隐患,随时可能遭遇损失,进而影响企业运营…

HashMap底层源码分析

文章目录HashMap底层源码分析1.观察HashMap成员变量1.1 HashMap的主要成员变量1.2 HashMap的构造方法1.3 put方法HashMap底层源码分析 前言 : 上文我们已经将哈希表学完了,下面就来简单的看一下源码,就结束我们的Map和Set 的学习   1.观察H…

灰度级形态学 - 顶帽变换和底帽变换

目录 1. 介绍 2. 代码实现 1. 介绍 顶帽变换和底帽变换就是图像的加减和开闭运算的结合 顶帽变换的公式为:原图 - 原图的开运算 这里结合开运算的几何图形解释来介绍顶帽变换。 因为开运算是结构元从下往上推动的过程,所以会删除图像灰度值相对周围高…

Dom对象总结案例实操(第二十课)

Dom对象总结案例实操(第二十课) 今天文章有点长 第一部分:回顾之前Dom对象我用了四篇文章对他进行了分开讲述Dom对象的用途,今天用几个案例实操一下. 之前我们Dom对象中了解过下面的内容 Dom对象的定义?Dom对象的节点操作,了解到了父节点 子节点 第一个 子节点 最…

利用Postman测试全屋智能接口

文章目录一、Postman概述二、利用Postman测试全屋智能接口(一)移动应用开发平台API说明V2.0(二)下载Postman(三)启动Postman(四)测试用户登录接口1、查看用户登录接口说明2、查看登录…