[算法设计与分析考点4] 改进的串匹配算法——KMP算法

news2024/11/18 11:18:22

 算法核心思想

        在BF算法的基础上加以改进,BF算法中每次当前字符不相等时,主串S要回溯到其下一个字符处,模式串T要回溯到 j=0 位置进行下一趟的匹配。然而,大多数情况下,这种回溯是没有必要的,非常耗时且效率低,是一种蛮力的思想。

        KMP算法在此基础上对其做了改进,就是增加了next数组,里面存放的值就是每次匹配失败后模式串T要回溯的下标位置,所以KMP算法的核心就在于如何求模式串T的next数组,至于后面的串匹配过程和BF算法原理一致。

 

 

 代码

#include<iostream>
#include<cstring>
using namespace std;
int next[]={0};
//求next值
void getNext(char T[],int next[]){
	int j=0,k=-1;
	next[0]=-1;
	while(T[j]!='\0'){
		if(k==-1){
			next[++j]=0;
			k=0;
		}
		else if(T[j]==T[k]){
			k++;
			next[++j]=k;
		}else {
			k=next[k];
		}
	} 
} 

//串匹配
int KMP(char S[],char T[]){
	int i=0,j=0;
	while(S[i]!='\0'&&T[j]!='\0'){
		if(S[i]==T[j]){
			i++;
			j++;
		}else{
			j=next[j];//不相等时,模式串回溯到对应的next值下标位置
			if(j==-1){
				i++;
				j++;
			} 
		}
	} 
	//当模式串全部被遍历完后,说明匹配成功,返回匹配成功时的开始位置 
	if(T[j]=='\0'){
		return (i-strlen(T))+1;
	}else{
	    return 0;	
	}	
} 
 
int main(){
	char S[]="abcabcacb";
	char T[]="abcac";
	cout<<"S="<<S<<endl;
	cout<<"T="<<T<<endl;
	getNext(T,next);//获取模式串T的next数组值
	int n=KMP(S,T);
	cout<<"模式串T的next数组值为:"<<endl;
	for(int i=0;i<5;i++){
		cout<<next[i]<<"  ";
	}
	cout<<endl;
	if(n!=0){
		cout<<"串匹配成功,起始位置为"<<n<<endl; 
	}else{
		cout<<"串匹配失败!"<<endl;
	}
	return 0;
} 

运行

 这里推荐一篇深入分析KMP算法的优质文章,三金大佬写的!

KMP算法真的有这么难吗?(清晰详细版)icon-default.png?t=N0U7https://blog.csdn.net/QAZJOU/article/details/126765353?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167538890716800215074340%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167538890716800215074340&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-126765353-null-null.142^v72^insert_down4,201^v4^add_ask&utm_term=%E4%B8%89%E9%87%91kmp%E7%AE%97%E6%B3%95&spm=1018.2226.3001.4187END.

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

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

相关文章

qt入门介绍

1.Qt 是一个跨平台的 C开发库。主要用来开发图形用户界面&#xff08;GUI&#xff09;程序。Qt 虽然经常被当做一个 GUI 库&#xff0c;用来开发图形界面应用程序&#xff0c;但这并不是 Qt 的全部&#xff1b;Qt 除了可以绘制漂亮的界面&#xff08;包括控件、布局、交互&…

【css】前端拉下代码后,node-sass sass-loader 与node版本不符怎么办

因为每次node和sass版本匹配都容易出现问题&#xff0c; 所以如果我自己开发&#xff0c;我不使用sass或者less&#xff0c;只用原生css 但如果是拉下来的项目&#xff0c;别人已经成功使用&#xff0c;webview版本 和 sass已经匹配&#xff0c;只需考虑 node版本匹配。 根据…

Hive分析函数系列文章

Hive分析窗口函数(一) SUM,AVG,MIN,MAXhttps://blog.csdn.net/weishuai90/article/details/128843715 Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANKhttps://blog.csdn.net/weishuai90/article/details/128858824 Hive分析窗口函数(三) CUME_DIST,PERCENT_RANKhttp…

Object类有什么作用?怎样使用Object类?

在Java中提供了一个Object类&#xff0c;它是所有类的父类&#xff0c;即每个类都直接或间接继承自该类&#xff0c;因此&#xff0c;Object类通常被称之为超类、基类或根类。当定义一个类时&#xff0c;如果没有使用extends关键字为这个类显示地指定父类&#xff0c;那么该类会…

【微积分易错点总结】函数、极限和连续

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的激励…

DSPE-PEG-DOTA,磷脂聚乙二醇大环配体 二硬脂酰基磷脂酰乙醇胺- 聚乙二醇-四氮杂环配体

中文名称&#xff1a;二硬脂酰基磷脂酰乙醇胺- 聚乙二醇-四氮杂环配体 英文名称&#xff1a;DSPE-PEG-DOTA 别称&#xff1a;1,2-distearoyl-sn-glycero-3-phosphoethanolamine-poly(ethylene glycol)-DOTA PEG分子量&#xff1a;1000、2000、3400、5000等等 用 途&#xf…

《流浪地球2》的现实倒影(一):从量子计算机到MOSS

编者按&#xff1a;跟大家一样&#xff0c;《流浪地球2》的上映让我们感到无比兴奋。作为科技领域的内容创作者&#xff0c;在《流浪地球2》中不仅看到了中国科幻电影与电影工业的崛起&#xff0c;更看到了大量现实中真实存在的科技脉络。由于这部电影在科技方面的基本功非常扎…

RK3568平台开发系列讲解(驱动基础篇)自旋锁详解

🚀返回专栏总目录 文章目录 一、什么是spinlock 自旋锁二、什么是raw_spinlock原始自旋锁三、自旋锁的使用3.1、spinlock 自旋锁相关API3.2、raw_spinlock原始自旋锁相关API沉淀、分享、成长,让自己和他人都能有所收获!😄 📢自旋锁用于处理器之间的互斥,适合保护很短的…

Python枚举类定义和使用

一些具有特殊含义的类&#xff0c;其实例化对象的个数往往是固定的&#xff0c;比如用一个类表示月份&#xff0c;则该类的实例对象最多有 12 个&#xff1b;再比如用一个类表示季节&#xff0c;则该类的实例化对象最多有 4 个。针对这种特殊的类&#xff0c;Python 3.4 中新增…

@WebServlet注解的解释和使用

大家好&#xff0c;今天分享一下WebServlet注解 首先&#xff0c;我们要知道&#xff0c;我们要写一个servlet程序,web,xml里的配置项很重要,里面包含了很多关于类绑定&#xff0c;以及服务器资源的请求路径问题&#xff08;就是注册&#xff09; 先把我这个看一遍&#xff0c…

【蓝桥杯】历届真题 完全二叉树的权值(省赛)Java

【资源限制】 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 【问题描述】 给定一棵包含N个节点的完全二叉树&#xff0c;树上每个节点都有一个权值&#xff0c;按从上到下、从左到右的顺序依…

SpringBoot将项目打包成JAR包或者WAR包

SpringBoot将项目打包成JAR包或者WAR包前言打包成JAR包打包成WAR包打包遇到的问题Maven环境问题跳过测试并打包前言 本文开发工具使用IDEA&#xff0c;已配置好Maven环境&#xff0c;如果未配置的可以参考另外一篇文章: Maven如何配置阿里镜像及安装全步骤 打包成JAR包 默认…

【C++】继承——切片、隐藏、默认成员函数、菱形

文章目录一、继承概念及定义二、赋值转换——切片三、继承的作用域——隐藏四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、菱形继承及菱形虚拟继承八、继承与组合九、结语一、继承概念及定义 概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最…

刚毕业小白软考中级什么专业合适?

如果只是想考取软考中级证书&#xff0c;可以考虑比较热门的考试项目&#xff0c;当然具体还是要看和自己的职业发展和需求是否匹配为前提&#xff0c;这样对于自己今后的职业生涯规划也有一定帮助。中级科目介绍&#xff1a;软考中级备考攻略&#xff1a;反正只要认真备考&…

使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成 上

阅读提示&#xff1a;本篇文章的代码为在普通GAN代码上实现人脸图片生成的修改&#xff0c;文章内容仅包含修改内容&#xff0c;全部代码讲解需结合下面的文章阅读。 相关资料链接为&#xff1a;使用PyTorch构建GAN生成对抗 本次训练代码使用了本地GPU计算。 1 CelebADataset类…

2023.1.23-1.29 AI行业周刊(第134期):春节回家乡的感受

春节的假期&#xff0c;时间过得很快。 年前回家在路上的时候&#xff0c;就考虑到过年时间短暂&#xff0c;但是当大年初六和家乡别离&#xff0c;和大姐二姐们再见的时候&#xff0c;心中还是充满了不舍。 2022年初回家过年的画面还印在脑海中&#xff0c;和家乡相聚的频率…

【自然语言处理】文本分析:非结构化信息分析科学与应用导论(主题建模)

文本分析&#xff1a;非结构化信息分析科学与应用导论&#xff08;主题建模&#xff09;1.介绍 文本聚类可以将数据&#xff08;这里即指文本&#xff09;按照一定规则划分为不同的群组&#xff0c;理想情况下可以从聚类结果中发现一些有趣的模式。不同聚类方法的一致性意义和…

QT 使用线程完成串口数据的读写,并把数据传递给主线程

1、之前做串口通信的时候直接在主线程 用了api实现&#xff0c;这种只做个串口助手是OK的&#xff0c;但是在大型项目中这样做会占用主线程的时间&#xff0c;数据量大的时候不确定有多卡顿。 2、看了网上很多资料&#xff0c;没一个写的是对的&#xff0c;主要错在 QSerialPo…

Linux-用户及文件权限管理

目录1、Linux 用户管理1.1 查看用户1.2 创建用户1.3 用户组1.4 删除用户和用户组2、Linux文件权限2.1 查看文件权限2.2 变更文件所有者2.3 修改文件权限3、补充1、Linux 用户管理 Linux可以实现多用户登录&#xff0c;A和B用户可以同时登录同一台主机&#xff0c;虽然他们的文…

IT帮助台如何帮助企业进行人力资源管理

在大多数组织中&#xff0c;HR 服务管理流程从内部聊天或电话开始&#xff0c;以 Word 文档和 Excel 工作表结束。以这种老式的方式管理所有这些信息变得非常乏味&#xff0c;因为 组织成长。大多数组织&#xff0c;即使有人力资源管理系统&#xff0c;也使用过时的系统&#x…