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

字符串匹配算法——KMP

有文本串aabaabaaf,模式串aabaaf问文本串中是否出现过模式串

暴力解法

最不用动脑子的,直接两层for循环,逐个匹配,匹配到不相等的值时把文本串后移一位,再重新比较。这种方法的复杂度是O(m×n),该方法低效的原因在于重复比较次数过多,比如当比较到aabaa时发现此时的fb不相符,又从头开始比较,但ff和b前有相同的aa,如果我们能直接从b开始比较是不是高效多了呢?由此产生了KMP算法。

KMP算法概述

KMP算法就是当模式串与文本串字符不等时,不移动至头部进行比较,比如fb不匹配,跳至b进行比较,节约了前面相同aa的比较次数,尝试将比较过程直观展示如下:
逐个比较到f发现不匹配

a	a	b	a	a	b	a	a	f
|	|	|	|	|	!=
a	a	b	a	a	f

此时再从之前已知匹配的aa后面的b开始比较即可

a	a	b	a	a	b	a	a	f|	|	|	|	|	|a	a	b	a	a	f

那我们如何得知之前匹配的内容呢?这时就要引入前缀表的概念。

前缀表

a	a	b	a	a	f
0	1	0	1	2	0

形如上表这样,比较到当前字符发现不匹配时,可由前一位对应的字符找到此时应跳转的位置,这样的表为前缀表,具体如何找到对应字符应跳转的位置,要先引入前后缀的概念。
前缀为包含首字母,不包含尾字母的所有字串;后缀为包含尾字母,不包含首字母的所有字串,以该模式串为例,其所有前缀和后缀为:

前缀:a	aa	aab	aaba	aabaa
后缀:f	af	aaf	baaf	abaaf

模式串不同字串对应的最长相等前后缀表格如下:

a		aa		aab		aaba	aabaa	aabaaf
0		1		0		1		2		0
a		a		b		a		a		f

当不匹配时找前一个字符最长相等前后缀即可,在编程中我们将其命名为next数组。

next数组代码示例

a	a	b	a	a	f
j	i	
0
void getNext(next,s)//s为模式串{	j=0;next[0]=0;//初始化,i,j表示后前缀末尾指向位置for(i=1;i<s.size();i++){//后缀指向1,第一个字符无后缀,故其最长相等前后缀为0while(j>0&&s[i]!=s[j])//当前后缀不等时,j等于前一个字符对应的next数组位置j=next[j-1];if(s[i]==s[j]//前后缀相等时,j后移一位,i的后移在循环中实现j++;next[i]=j;}保存next数组}
}			

该代码实现了next数组即解决了如果当下不满足时该从何处比较的问题,也就是求出不同字符串下最长相等前后缀,方式是比较前后缀的最后一位来判定,那我想比较前后缀相同不是还要通过两个for循环来实现吗,为什么比较前后缀的最后一位就能判定两个不同的字符串最大相等前后缀长度呢?
当前后缀相等时我们很好理解,因为前面的相等已经判断过了,所以如果当下判定位置仍相等时,只需在上一次结果上+1即可;主要是当下判定位置不等时如何理解,执行步骤是向前遍历,直至找到与后缀字符相等的字符,并将前缀末尾指向之,想了半天又看了几遍实在不明白咋回事,贴两张图看看能不能理解吧,好像用到了动态规划的思想?前后缀匹配
前后缀不匹配

总结

KMP算法是用于比较字符串的一种高效算法,特点在于字符串只向前,模式串节约了重复部分的比较次数,实现通过next数组,但涉及next数组的求解人家有很巧妙的办法,五行代码就给搞定了,比我手算还简单,没有明白,暂时就到此为止吧。

相关文章:

字符串匹配算法——KMP

有文本串aabaabaaf&#xff0c;模式串aabaaf问文本串中是否出现过模式串 暴力解法 最不用动脑子的&#xff0c;直接两层for循环&#xff0c;逐个匹配&#xff0c;匹配到不相等的值时把文本串后移一位&#xff0c;再重新比较。这种方法的复杂度是O(mn)&#xff0c;该方法低效的…...

电子学会C/C++编程等级考试2023年03月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:字符长方形 给定一个字符,用它构造一个长为4个字符,宽为3个字符的长方形,可以参考样例输出。 时间限制:1000 内存限制:65536输入 输入只有一行, 包含一个字符。输出 该字符构成的长方形,长4个字符,宽3个字符。样例输入…...

微信小程序汽车租赁系统

微信小程序汽车租赁系统 本系统包含了3类用户&#xff0c;分别为客户、员工以及管理员&#xff0c;客户主要是满足自身的租车需求&#xff0c;员工主要负责车辆的调度问题和维修状况&#xff0c;管理员则是主要对人员、车辆和订单的管理。以下是对各自功能的详细介绍: 客户可…...

docker部署微服务

目录 docker操作命令 镜像操作命令 拉取镜像 导出镜像 删除镜像 加载镜像 推送镜像 部署 pom文件加上 在每个模块根目录加上DockerFile文件 项目根目录加上docker-compose.yml文件 打包&#xff0c;clean&#xff0c;package 服务器上新建文件夹 测试docker-compo…...

统计voc格式数据中的xml标签、bndbox到excel表格中

有这么个需求是将xml的内容: 1,filename 2.label 3.bndbox:xmin,xmax,ymin,ymax。 … 将这些东西写入excel表格中,方便我统计标签数量和框的分布! 于是撰写了脚本:xml2csv.py 我的xml文件形式如下。大家的目标检测格式大同小异! <annotation><folder>UAV_d…...

51单片机利用I/O口高阻状态实现触摸控制LED灯

51单片机利用I/O口高阻状态实现触摸控制LED灯 1.概述 这篇文章介绍使用I/O口的高阻状态实现一个触摸控制LED灯亮灭的实验。该实验通过手触摸P3.7引脚&#xff0c;改变电平信号控制灯的亮灭。 2.实验过程 2.1.实验材料 名称型号数量单片机STC12C20521LED彩灯无1晶振12MHZ1电…...

自动驾驶术语汇总

目录 智驾级别芯片相关自动驾驶相关辅助驾驶相关预警相关传感器相关泊车相关安全相关车灯相关 智驾级别 L0-L2属于辅助驾驶&#xff0c;L4-L5才算自动驾驶 L0&#xff08;Level 0&#xff09;&#xff1a;无自动化。这是大多数传统汽车的级别&#xff0c;所有的驾驶任务都需要…...

Jsonpath - 数据中快速查找和提取的强大工具

JSON&#xff08;JavaScript Object Notation&#xff09;在现代应用程序中广泛使用&#xff0c;但是如何在复杂的JSON数据中 查找和提取所需的信息呢&#xff1f; JSONPath是一种功能强大的查询语言&#xff0c;可以通过简单的表达式来快速准确地定位和提取JSON数据。本文将介…...

java中,通过替换word模板中的关键字后输出一个新文档

一、要用到的jar包 我已上传了相关的jar包&#xff0c;需要的可以通过以下链接直接下载&#xff1a; https://download.csdn.net/download/qq_27387133/88558034 具体jar包截图&#xff1a; 二、实现的代码 注意&#xff1a;文件要用docx格式!!! word变量替换的方法&#…...

MySQL数据库约束你真的懂吗?

✏️✏️✏️今天给各位带来的是关于数据库约束方面的知识 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; 动动你们发财的小手&#xff0c;点点关…...

YOCTO 下载repo工具失败解决办法

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repocp repo ~/binchmod ax ~/bin/repo如果使用时报错&#xff0c; 切换ubuntu 到 python3 版本。gedit repo 修改repo默认链接地址&#xff1a;REPO_URL "https://gerrit.googlesource.com/git-repo"…...

github连接失败Host key verification failed.解决方案

问题描述 之前一直用的gitee协同协作&#xff0c;然后再最近一次云计算项目中团队使用的是github进行协作&#xff0c;但是按照常规步骤再GitHub上配置了ssh密钥后&#xff0c;却依然显示连接失败&#xff0c;无法推送和拉取代码&#xff0c;克隆仓库也是报错拒绝。具体报错信…...

【TIDB】TiDB认证考试PTCA 练习题 题库

目录 题目 答案 解析 题目 1.下列功能是由 TiKV 或 TiFlash 实现的为&#xff1f;&#xff08; 选 2 项 &#xff09; A. 根据集群中 Region 的信息&#xff0c;发出调度指令 B. 对于 OLAP 和 OLTP 进行业务隔离 C. 将关系型数据转化为 KV 存储进行持久化 D. 将 KV 存储…...

PPP/INS紧组合算法

前言&#xff1a;在学习紧组合之前学会GNSS/INS松组合是很有必要的&#xff0c;i2NAV团队开源的KF_GINS项目可以作为GNSS/INS松组合学习模板&#xff0c;本文章主要对武汉大学i2NAV发布的PPP/INS紧组合学习资源进行算法层面的总结&#xff0c;链接&#xff1a; 武汉大学多源智…...

c++ 演讲比赛流程管理系统 / from.黑马

...

【shell】 1、bash语法超详细介绍

文章目录 修改前缀路径dirname set常用函数参数变量local 返回值正则打印第 n 行获取行号核对数据库各表数量jq查询检查日志 sshpassexpect数组xargs bash manual 修改前缀 参考 export PS1"bash> "路径 dirname strip last component from file name dir$(…...

华清远见嵌入式学习——网络编程——作业3

目录 作业要求&#xff1a;基于UDP的TFTP文件传输 代码 下载功能效果图​编辑 上传功能效果图 思维导图 模拟面试题和答案&#xff08;定期更新&#xff09; 作业要求&#xff1a;基于UDP的TFTP文件传输 完成文件的上传和下载功能 代码 #include<myhead.h>//实现…...

前端学习--React(3)

一、Redux 集中状态管理工具&#xff0c;不需要react即可使用&#xff0c;每个store的数据都是独立于组件之外的 vue小链接&#xff1a;vuex/pinia 基本使用 Redux将数据修改流程分成三个概念&#xff0c;state、action和reducer state - 一个对象 存放我们管理的数据状态 a…...

rotation matrix reflection matrix

文章目录 1. rotation matrix1.1 结论 2. reflection matrix2.1 结论 1. rotation matrix 图像逆时针旋转 θ \theta θ的矩阵 Q r o t a t e [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] (1) Q_{rotate}\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\c…...

Python基础教程: sorted 函数

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 sorted 可以对所有可迭代的对象进行排序操作&#xff0c; sorted 方法返回的是一个新的 list&#xff0c;而不是在原来的基础上进行的操作。 从新排序列表。 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...