当前位置: 首页 > news >正文

KMP算法详细理解

一、目的

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++;  最长相等前后缀长度加1next[i] = j;  }//将j(前缀的长度)赋给next【i】,不管前后缀是否相同,都要存放

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

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

相关文章:

KMP算法详细理解

一、目的1.KMP应用场景&#xff1a;可以解决字符串匹配问题&#xff1b; 在一个串中查找是否出现过另一个串。2.KMP的经典思想就是:当出现字符串不匹配时&#xff0c;可以记录一部分之前已经匹配的文本内容&#xff0c;利用这些信息避免从头再去做匹配。3.KMP算法关键在于&…...

RabbitMQ单节点安装

在学习RabbitMQ之前&#xff0c;必须要把RabbitMQ的环境搭建起来&#xff0c;刚开始学习时&#xff0c;搭建单节点是入门RabbitMQ最方便、最快捷的方式&#xff0c;这篇文章就是介绍如何使用RabbitMQ压缩包的方式搭建一个单节点的RabbitMQ。 在实际项目中&#xff0c;服务器都…...

tomcat 服务的目录结构和tomcat的运行模式

目录 一、tomcat 服务的目录结构解析&#xff1a; 1、tomcat目录结构&#xff1a; bin目录&#xff1a; conf目录&#xff1a; lib目录&#xff1a; logs目录&#xff1a; temp目录&#xff1a; webapps目录&#xff1a; wokr目录&#xff1a; 二、tomcat服务的运行模…...

vector迭代器失效问题

一、迭代器&#xff1a; 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就是一个指针&#xff0c;或者是对指针进行了封装&#xff0c;比如&#xff1a;vector的迭代器就是原生态指针T* 。因此迭代器失效&#xff0c;实际就是迭代器底层对应指针所…...

2023年排名前茅的十大饭店装修设计!

相信大家都是知道的&#xff0c;饭店装修设计其实是一门很深的学问&#xff0c;只有掌握这门学问才能够打造出来精美的空间&#xff0c;因此饭店装修必须要有专业餐饮设计公司的设计师进行设计。但是在国内饭店装修设计公司那么多&#xff0c;饭店老板要如何选择呢&#xff1f;…...

MFCCA多通道多说话人语音识别模型上线魔搭(ModelScope)

实验室研发的基于多帧跨通道注意力机制&#xff08;MFCCA&#xff09;的多说话人语音识别模型近日上线魔搭&#xff08;ModelScope&#xff09;社区&#xff0c;该模型在AliMeeting会议数据集上获得当前最优性能。欢迎大家下载。开发者可以基于此模型进一步利用ModelScope的微调…...

刷题记录:牛客NC25078[USACO 2007 Ope S]City Horizon

传送门:牛客 题目描述: Farmer John has taken his cows on a trip to the city! As the sun sets, the cows gaze at the city horizon and observe the beautiful silhouettes formed by the rectangular buildings. The entire horizon is represented by a number line …...

【Java|golang】 1238. 循环码排列---格雷编码

给你两个整数 n 和 start。你的任务是返回任意 (0,1,2,…,2^n-1) 的排列 p&#xff0c;并且满足&#xff1a; p[0] start p[i] 和 p[i1] 的二进制表示形式只有一位不同 p[0] 和 p[2^n -1] 的二进制表示形式也只有一位不同 示例 1&#xff1a; 输入&#xff1a;n 2, start …...

Python自动化测试框架封装和调用

封装与调用函数与参数化前言 面实现了参数的关联&#xff0c;那种只是记流水账的完成功能&#xff0c;不便于维护&#xff0c;也没什么可读性&#xff0c;接下来这篇可以把每一个动作写成一个函数&#xff0c;这样更方便了。参数化的思维只需记住一点&#xff1a;不要写死 登录…...

线程的执行

承接上文CPU原理简介程序的执行是由控制器发信号推动整个程序一步一步向前走&#xff0c;将数据存储在寄存器&#xff0c;从程序计数器中获取指令&#xff0c;比如先把3放到寄存器&#xff0c;再把5放到寄存器&#xff0c;再做一个加法&#xff0c;加法就是一个指令&#xff0c…...

【视频】海康摄像头、NVR网络协议简介

1、软硬件整体架构 2、涉及的网络协议 3、协议简介 3.1 海康私有协议 设备发现SADP:进行设备的发现、激活、修改网络参数、忘记密码等; SDK:4200、系统平台的接入前端设备,协议不对外开放,但对外提供接口库; ISAPI:Intelligent Security API(智能安全API),基于HTTP传输…...

【Spring的事务传播行为有哪些呢?Spring事务的隔离级别?讲下嵌套事务?】

如果你想寻求一份与后端相关的开发工作&#xff0c;那么关于Spring事务相关的面试题你就不能说不会并且不能不知道&#xff1f; 人生如棋&#xff0c;我愿为卒&#xff0c;行动虽慢&#xff0c;可谁曾见我后退一步&#xff1f; 一.Spring中声明事务的方式 1.1 编程式事务 编程…...

其实一点不难学会这三步一定让你学会制作一个『3D建模』大屏

上次已经教过大家怎样制作一个简单的2D数据可视化大屏~那有一些朋友们就会说那些炫酷的3D可视化大屏是怎样制作的呢&#xff1f;这不就来了&#xff0c;今天就教大家怎样用山海鲸可视化软件制作一个带3D建模的可视化大屏&#xff0c;并且最重要的是无需会特别复杂的3D建模知识。…...

【C++】C++的内存模型之四大分区

程序的内存模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&…...

Vue跨级通信(重点)

当不使用Vuex的前提下&#xff0c;子孙传递就得使用另外一种办法&#xff1a;provide 和 inject 总结&#xff1a;provide / inject 类似于消息的订阅和发布。- inject接收数据。- provide提供或发送数据&#xff0c;&#xff08;1&#xff09;provide&#xff08;name&#xf…...

支付系统中的设计模式07:责任链模式

最近公司业务的发展果然如老板当初所画(预)饼(言)的那样红(恍)红(恍)火(惚)火(惚),蒸蒸日上,每天的流水都在不断攀升到新的高度,有不少人都从公司开发的电商平台挣到了钱。 不过问题也接着来了——运营部门经过老板的同意,也学着产品经理提出了下面几项非常合理…...

期末综合考试

一、概率论1、全概率公式、贝叶斯公式应用2、期望、方差、协方差的定义以及性质证明(1) 期望(2) 方差(3) 协方差二、数理统计1、参数估计(1) 矩估计(2) 最大似然估计(3) 综合例题一、概率论 1、全概率公式、贝叶斯公式应用 记住标黄的两段&#xff0c;上考场直接套数据&#x…...

数据结构与算法之爬楼梯动态规划

一.题目(爬楼梯)假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f;注意&#xff1a;给定 n 是一个正整数。示例 1&#xff1a;输入&#xff1a; 2输出&#xff1a; 2解释&#xff1a; 有两种方法可以爬…...

CleanMyMac4.12最新Mac电脑系统垃圾清理神器

CleanMyMac是Mac一款神器&#xff0c;特别是清理已卸载软件残留垃圾文件信息库比较全面。 clearmymac以极其快速和时尚的方式为您提供及时的建议&#xff0c;组织&#xff0c;更新和保护您的Mac。完全支持macOS 11&#xff08;Big Sur&#xff09;操作系统&#xff1b;它以其简…...

数据治理如何做?火山引擎 DataLeap 帮助这款产品 3 个月降低计算成本 20%

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 本文讲述字节跳动一款 App 产品的数据治理故事。该产品随着用户体量和数据体量不断增长&#xff0c;数仓的任务量、数据量也不断攀升&#xff0c;运维难、成本贵、稳…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...