字符串匹配算法——KMP

news2024/11/17 11:50:28

有文本串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,第一个字符无后缀,故其最长相等前后缀为0
			while(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数组的求解人家有很巧妙的办法,五行代码就给搞定了,比我手算还简单,没有明白,暂时就到此为止吧。

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

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

相关文章

软件开发及交付的项目管理角色

在软件开发及交付过程中&#xff0c;通常会涉及不同的角色和职责&#xff0c;包括业务角色、技术角色和管理角色。这些角色在项目管理中发挥着不同的作用&#xff0c;以确保项目的成功和交付高质量的产品。 业务角色&#xff1a;包括产品经理、业务分析师和业务运营人员等职位…

Confluence Server Webwork 预身份验证 OGNL 注入 (CVE-2021-26084)

漏洞描述 Confluence 是由澳大利亚软件公司 Atlassian 开发的基于 Web 的企业 wiki。 存在一个 OGNL 注入漏洞&#xff0c;允许未经身份验证的攻击者在 Confluence Server 或 Data Center 实例上执行任意代码。 漏洞环境及利用 搭建docker环境 Confluence搭建见前文 Atlas…

网络层协议-IP协议

目录 基本概念IP协议格式分片与组装分片组装 网段划分特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址路由 基本概念 TCP作为传输层控制协议&#xff0c;其保证的是数据传输的可靠性和传输效率&#xff0c;但TCP提供的仅仅是数据传输的策略&#xff0c;而真正负责数据在网…

Android JNI 异常定位(2)—— addr2line

Android native报错有时候只有一句 signal 11 (SIGSEGV)&#xff0c;这种情况仅通过log是很难定位到问题的。不过Android 在/data/tombstones目录保存了错误的堆栈信息&#xff0c;为定位bug提供了路径。不过一般这里的log都无法像java一样直接定位的出错的行数。如下图&#x…

Python“牵手”淘宝商品详情接口运营场景,淘宝商品详情接口调用指南

淘宝商品详情数据接口是淘宝开放平台提供的一个API接口&#xff0c;用于获取商品详细信息。通过这个接口&#xff0c;开发者可以根据商品ID或商品链接&#xff0c;获取该商品的详细信息&#xff0c;包括标题、价格、销量、描述等。 要使用淘宝商品详情接口&#xff0c;首先需要…

为什么程序员不直接用线上环境写代码呢?

为什么程序员不直接用线上环境写代码呢&#xff1f; 有的&#xff0c;我就是直接用Linux作为主力电脑使用&#xff0c;大概从201 6年起&#xff0c;我就开始这样干了。无论是编 程、画电路板、画UI、剪视频.... 都在Linux上面完成。 编程工具大部分都有Linux版本&#xff0c;…

Python接口自动化测试——如何搭建测试环境

前言 接口测试的方式有很多&#xff0c;比如可以用工具&#xff08;jmeter,postman&#xff09;之类&#xff0c;也可以自己写代码进行接口测试&#xff0c;工具的使用相对来说都比较简单&#xff0c;重点是要搞清楚项目接口的协议是什么&#xff0c;然后有针对性的进行选择&a…

YOLOv5分割训练,从数据集标注到训练一条龙解决

最近进行了分割标注&#xff0c;感觉非常好玩&#xff0c;也遇到了很多坑&#xff0c;来跟大家分享一下&#xff0c;老样子有问题评论区留言&#xff0c;我会的就会回答你。 第一步&#xff1a;准备数据集 1、安装标注软件labelme如果要在计算机视觉领域深入的同学&#xff0…

轻松记录收支明细,一键打印,财务无忧!

作为现代人&#xff0c;管理好个人财务是非常重要的。但是&#xff0c;如何记录收支明细并打印出来呢&#xff1f;今天&#xff0c;我们向您推荐一款财务软件&#xff0c;帮助您轻松解决这个问题。 首先第一步&#xff0c;我们要打开【晨曦记账本】&#xff0c;并登录账号。 第…

2020年09月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下面程序,屏幕上最多会看到多少个苹果? A:10个 B:11个 C:1个 D:无法确定 答案:B 第2题 关于下面程序,说法正确的是 ? A:执行 后,马上执行

国内怎么投资黄金,炒黄金有哪些好方法?

随着我国综合实力的不断强大&#xff0c;投资市场的发展也日臻完善&#xff0c;现已成为了国际黄金市场的重要组成部分&#xff0c;人们想要精准判断金市走向&#xff0c;就离不开对我国经济等信息的仔细分析。而想要有效提升盈利概率&#xff0c;人们还需要掌握国内黄金投资的…

加速软件开发:自动化测试在持续集成中的重要作用!

持续集成的自动化测试 如今互联网软件的开发、测试和发布&#xff0c;已经形成了一套非常标准的流程&#xff0c;最重要的组成部分就是持续集成&#xff08;Continuous integration&#xff0c;简称CI&#xff0c;目前主要的持续集成系统是Jenkins&#xff09;。 那么什么是持…

Redis Stream消息队列

什么是Stream? Stream 实际上是一个具有消息发布/订阅功能的组件&#xff0c;也就常说的消息队列。其实这种类似于 broker/consumer(生产者/消费者)的数据结构很常见&#xff0c;比如 RabbitMQ 消息中间件、Celery 消息中间件&#xff0c;以及 Kafka 分布式消息系统等&#x…

2023年跨界融合创新应用合作发展大会-核心PPT资料下载

一、峰会简介 本次大会主题为“创新地理信息价值 服务数字中国建设”。1天主论坛和6场专题论坛的报告&#xff0c;围绕主题深入探讨地理信息产业与相关重要应用领域的跨界融合和深化合作。 本届大会将搭建地理信息产业与旅游、林业、环保、气象、住建、水利、农业农村、电力等…

2023亚太杯数学建模竞赛C题新能源电动汽车数据分析与代码讲解

C题论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解、问题4模型的建立和求解、问题5模型的建立和求解&#xff09;、模型的评价等等&#xff0c; 视频讲解如下&…

MySQL-01-MySQL基础架构

1-MySQL逻辑结构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图&#xff0c;有助于深入理解MySQL服务器。下图展示了MySQL的逻辑架构图。 MySQL逻辑架构整体分为三层&#xff0c;最上层为客户端层&#xff0c;并非MySQL所独有&#xff0c;诸如&#xff1a;连接处…

驯服大数据的超强利器——PySpark数据处理引擎

你是否曾经为了处理大规模数据而烦恼&#xff1f;是否曾经为了解决日常的数据科学挑战而彻夜难眠&#xff1f;现在&#xff0c;Spark数据处理引擎正在向你敞开大门。这是一个惊人的分析工厂&#xff0c;输入原始数据&#xff0c;输出洞察。 PySpark&#xff0c;作为Spark的核心…

一文掌握 Spring Boot 常用注解,保姆级整理,建议收藏!

亲兄弟篇&#xff1a; SpringBoot注解大全&#xff08;超详细&#xff09;_Maiko Star的博客-CSDN博客 一、SpringBoot常用注解 二、Bean处理注解 2.1 Resource 依赖注入&#xff0c;自动导入标注的对象到当前类中&#xff0c;比如我们的 Controller 类通常要导入 Service 类…

java中BigDecimal的介绍及使用(二)

系列文章目录 java中BigDecimal的介绍及使用&#xff0c;BigDecimal格式化&#xff0c;BigDecimal常见问题java中BigDecimal的介绍及使用(二) 文章目录 系列文章目录一、前言二、BigDecimal提供的方法2.1、stripTrailingZeros() 去除小数尾部所有的02.2、int signum()2.3、int…

JAVA爬虫2 - Jsoup解析、对接MySQL、多线程爬虫、json库使用

官网:https://jsoup.org/download Jsoup是一款基于Java的HTML解析器,它可以方便地从网页中抓取和解析数据。它的主要作用是帮助开 发者处理HTML文档,提取所需的数据或信息。下面介绍几个常用的API: 选择器(Selector)API:用于根据CSS选择器语法选择HTML元素。 属性(Attribute…