kmp算法

kmp算法总体来说分为两步:

1、next数组求解

  根据下边的子函数GetNext()来理解,其中,最难理解的为j = next[j]这一步,如下图,两个||表示最长的匹配好的前缀和后缀,那么接下来,这个父串中后缀直接和子串的前缀进行匹配好了(就是一个等价关系:父前缀=子前缀=父后缀=子后缀),只需要比较父串当前位置和子串中最长前缀的下一位即可,而这个下一位就是next[j]。

  确实难懂啊!!!!我也是琢磨了好久才明白的,发明这些算法的,简直他妈就是变态!!!!

 

2、kmp查找

这个逼就好理解多了,不做多解释,下面贴代码

#include<bits/stdc++.h>
using namespace std;

void PrintArr(int *p, int len)
{
	for (int i = 0; i < len; i++)
		cout << p[i] << " ";
	cout << endl;
}
void GetNext(string a,int *next,int len)
{
	int i = 0;
	int j = -1;
	next[0] = -1;
	while (i < len)
	{
		if (j == -1 || a[i] == a[j])
		{
			++i;
			++j;
			next[i] = j;
		}
		else
		{
			j = next[j];
		}
	}
}

void KmpFind(string s1, string s2, int *next)
{
	int len1 = strlen(s1.c_str());
	int len2 = strlen(s2.c_str());
	int i = 0;
	int j = 0;
	while (i < len1 && j < len2)
	{
		if (j == -1 || s1[i] == s2[j])
		{
			++i;
			++j;
		}
		else
		{
			j = next[j];
		}
	}
	if (j == len2)
	{
		cout << "子串在父串中第一次出现的位置:" << i - j + 1 << endl;
	}
	else
	{
		cout << "子串不在父串中" << endl;
	}
}
int main()
{
	string a = "ababaaaba";
	string b = "abcadbaababaaabababc";
	int len = strlen(a.c_str());
	//cout << sizeof(a) << endl;
	int *next = (int *)malloc(len * sizeof(int));
	GetNext(a, next, strlen(a.c_str()));
	PrintArr(next,len);
	KmpFind(b, a, next);
	system("pause");
	return 0;
}

 

i画船听雨
关注 关注
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C++的KMP算法
全栈工程师Linda的博客
06-03 1084
C++的KMP算法
KMP算法 → 计算next数组
hnjzsyjyj的专栏
09-28 1万+
若在KMP算法设计中,将模式串下标从0开始计数,则定义next[0]=-1,next[1]=0。那么求next数组的算法步骤为: (1)若第j-1位的字符与第x位的字符相等,则next[j]=x+1; (2)若直到第0位依然没有字符与第j-1位的字符相等,则next[j]=0。
KMP算法详解
darknight
03-15 1万+
KMP算法是求解主串(以下简称为s)和模式串(以下简称为p)匹配问题的O(n)算法。 其核心思想就是,当s[i]和p[j]发生不匹配现象时,i指针不需要回溯,只需j指针回溯。 例如: 当s[i]和p[j]发生失配,一种暴力的方法就是i回溯到上一次起始位置的下一个位置,j移动到0,然后重新进行比较。 但是实际上,从我们人的角度来看,solution1一定是进行了一次无用的匹配,因为这次匹配一定是无...
数据结构KMP算法配图详解(超详细)
weixin_46007276的博客
02-18 21万+
前言 KMP算法是我们数据结构串中最难也是最重要的算法。难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维。真正理解代码的人可以说对KMP算法的了解已经相当深入了。而且这个算法的不少东西的确不容易讲懂,很多正规的书本把概念一摆出直接劝退无数人。这篇文章将尽量以最简单的方式介绍KMP算法以及他的改进,文章的开始我先对kmp算法的三位创始人Knuth,Morris,Pratt致敬,懂得这...
KMP算法
码明的博客
10-12 1328
NEXT[0] 通常初始化为 -1。如果,则,同时递增i和j。如果不匹配,且j > 0,回退到NEXT[j-1],否则。NEXT数组的构建时间复杂度是 O(m),其中 m 是子串的长度。代码演示:// 注意i从1开始,j从0开始// next数组的第一个值为0j++;i++;
图解KMP算法,带你彻底吃透KMP
qq_43869106的博客
01-23 5万+
KMP算法一直是一个比较难以理解的算法,本篇文章主要根据《大话数据结构》中关于KMP算法的讲解,结合自己的思考,对于KMP算法进行一个比较详细的解释。
KMP 算法详解
Hello World!
04-22 3万+
KMP算法是一种高效的字符串匹配算法,算法名称取自于三位共同发明人名字的首字母组合。该算法的主要使用场景就是在字符串(也叫主串)中的模式串(也叫子串)定位问题,常见的有“求子串出现的起始位置”、“求子串的出现次数”等。
KMP算法—终于全部弄懂了
热门推荐
dark_cy的博客
03-22 43万+
详细讲解KMP算法,并对难点 k=next[k] 这条语句重点描述
详解小白之KMP算法及python实现
09-19
KMP算法,全称Knuth-Morris-Pratt算法,是一种高效的字符串匹配算法,主要用于解决在一个主串(字符串str)中查找子串(字符串substr)的问题。相较于暴力搜索方法,KMP算法的时间复杂度降低到了O(m+n),显著提高了...
传统KMP算法与改进KMP算法的对比
05-06
KMP算法,全称为Knuth-Morris-Pratt算法,是一种在字符串中寻找子串的高效搜索算法。它由D.E. Knuth、V. Morris和J.H. Pratt三位学者于1970年提出,主要用于解决模式匹配问题。传统的KMP算法避免了不必要的字符比较...
KMP算法最浅显理解(小白教程)
01-20
KMP算法看懂了觉得特别简单,思路很简单,看不懂之前,查各种资料,看的稀里糊涂,即使网上最简单的解释,依然看的稀里糊涂。 我花了半天时间,争取用最短的篇幅大致搞明白这玩意到底是啥。 这里不扯概念,只讲...
kmp.rar_kmp算法伪代码
09-23
这个“kmp.rar”压缩包包含了一个C++实现的KMP算法以及Hirschberg算法的源码,这些资源对于理解和应用字符串搜索算法非常有帮助。 KMP算法的核心在于构造一个“部分匹配表”(也称为“失败函数”或“前缀后缀表”)...
字符串的模式匹配详解--BF算法与KMP算法
09-04
KMP算法的关键在于构造了一个名为`next[]`的数组,它记录了模式串P的每一个前缀和后缀的最大公共长度。这个数组可以帮助我们确定在匹配失败时,不需要回溯,可以直接从模式串的某个位置开始继续匹配。例如,对于模式...
Java ssm 面试题(2025最新版).docx
10-21
Java ssm 面试题(2025最新版)
【发文无忧】基于天鹰优化算法AO-Kmean-Transformer-GRU实现数据回归预测算法研究Matlab代码.rar
最新发布
10-21
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
【发文无忧】基于蝗虫优化算法GOA-Kmean-Transformer-GRU实现数据回归预测算法研究Matlab代码.rar
10-21
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
【创新发文无忧】Matlab实现鹈鹕优化算法POA-Kmean-Transformer-GRU故障诊断算法研究.rar
10-21
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
KMP算法详解与实现
"本文将介绍KMP算法,一种高效的字符串匹配算法,由D.E.Knuth、V.R.Pratt和J.H.Morris三位学者独立发现。KMP算法的核心在于利用预处理得到的next函数,存储模式串的局部匹配信息,避免在比较过程中不必要的字符回溯...
写文章

热门文章

  • c语言中break的使用 5025
  • 对一个几乎有序的数组的进行排列 2207
  • 判断三边是否构成一个三角形 1691
  • 数组排序之后相邻数的最大差值 741
  • 项目中Qt的UI界面的配置问题 514

最新评论

  • c语言中break的使用

    i画船听雨: 还有switch

  • kmp算法

    123123123LWQ: 大佬就是大佬,佩服

  • 树的序列化与反序列化

    123123123LWQ: 就这 ?????????????????大佬牛逼!

  • 数组进行自动类型转换

    123123123LWQ: 就这?????

  • kmp算法

    weixin_44738999: 大佬就是大佬,佩服

大家在看

  • Cpp::STL—容器适配器priority_queue的讲解和模拟实现(17)
  • 使用Python处理API数据时,有哪些常见的数据清洗技巧? 86
  • 《API数据的“速递员”:您的代码快递已到达》
  • 语音识别——使用Vosk进行语音识别 559
  • AI产品经理:从入门到精通,一篇文章带你入门!(附学习资料) 660

最新文章

  • 数组进行自动类型转换
  • C++实现蓝桥杯模拟正整数序列的数量
  • 项目中Qt的UI界面的配置问题
2020年3篇
2019年14篇
2018年3篇
2017年2篇
2016年3篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家深圳红色玻璃钢卡通雕塑景区玻璃钢雕塑订做玻璃钢樱桃娃娃雕塑新疆乌鲁木齐玻璃钢花盆河南省玻璃钢雕塑生产厂家吉林玻璃钢熊猫雕塑厂家玻璃钢花盆查询山西玻璃钢海豚雕塑厂家福建玻璃钢雕塑艺术品定制益阳商场美陈花器贵州省玻璃钢雕塑东莞玻璃钢现代人物雕塑批发廊坊商场美陈临沂景区玻璃钢雕塑厂家元旦 商场 美陈玻璃钢雕塑样本优惠的玻璃钢动画雕塑上海欧式玻璃钢雕塑市场成都玻璃钢雕塑款式齐全成都玻璃钢花盆设计企业四川中庭商场美陈价格个旧市玻璃钢雕塑设计公司做玻璃钢雕塑大全上海商场美陈市场漯河附近不锈钢玻璃钢彩绘雕塑眉山商场美陈熊猫商场美陈定制玻璃钢动物雕塑供应商河北走廊商场美陈南阳玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化