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

【算法——KMP】

1理解next数组定义:最长相等前后缀(不含当前字符并且不能是整体)

算法讲解100【扩展】 KMP算法原理和代码详解_哔哩哔哩_bilibili

next数组的值:假设这个i出现了不匹配就从next[i]的位置开始在再匹配

2next数组生成

 看一下是怎么跳的:算法讲解100【扩展】 KMP算法原理和代码详解_哔哩哔哩_bilibili

为什么这么跳:算法讲解100【扩展】 KMP算法原理和代码详解_哔哩哔哩_bilibili

next代码:算法讲解100【扩展】 KMP算法原理和代码详解_哔哩哔哩_bilibili

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

vector<int> fun_next(string str1)    //next生成
{
	vector<int>next(str1.size());
	next[0] = -1;
	next[1] = 0;

	int i = 2, cn = 0;
	while (i < str1.size())
	{
		if (str1[i - 1] == str1[cn])
			next[i++] = ++cn;   
		else if (cn > 0)   //一次不成功,cn还可以往前跳 。cn为0说明没有前后缀,下一个就是0了 
			cn = next[cn];  
		else 
			next[i++] = 0;
	}

	return next;
}

int main()
{
	string str1("abcabc");
	string str2("afdfabcabcghj");
	vector<int>next = fun_next(str1);
	for (auto i : next)
		cout << i << " ";
	cout << endl;

	int m = str1.size(), n = str2.size();
	int i = 0, j = 0;
	while (i < m && j < n)   //匹配
	{
		if (str1[i] == str2[j])
		{
			i++; 
			j++;
		}
		else if (i == 0)
			j++;
		else
			i = next[i];
	}

	if (i == m)
		cout << "找到了:" << j - i;
	else
		return -1;

	return 0;
}


http://www.kler.cn/news/327394.html

相关文章:

  • 论文阅读【时间序列】ModerTCN (ICLR2024)
  • Qt Linguist手册-翻译员
  • uni-app如果自定义tabbar实现底部样式有凸起效果,背景带圆角
  • 数据结构:链表算法题
  • 机器学习:opencv--摄像头OCR
  • stable diffusion Webui插件的三种安装方法
  • 数据包签名校验的Web安全测试实践
  • go 使用笔记
  • django drf to_representation
  • 报错TypeError: cannot unpack non-iterable float object
  • CDGA|数据治理:策略与价值的深度融合
  • 第18周 2-正则表达式
  • 数据库 - Redis数据库
  • 爬虫设计思考之一
  • World of Warcraft [CLASSIC][80][Grandel] /console cameraDistanceMaxZoomFactor 2
  • Spring Boot 点餐系统:高效餐饮服务
  • 43. 创建纹理贴图
  • 使用Qt实现实时数据动态绘制的折线图示例
  • 从入门到精通:单片机 100个关键技术关键词
  • (最新已验证)stm32 + 新版 onenet +dht11+esp8266/01s + mqtt物联网(含微信小程序)上报温湿度和控制单片机(保姆级教程)
  • 信号量SEM
  • 淘宝商品详情API接口多线程调用:解锁数据分析行业的效率新篇章
  • Linux防火墙配置绿色端口,解决无法访问java服务的问题
  • LINUX下的驱动开发三
  • window系统下nginx管理脚本
  • 【数据库】深入解析 MongoDB 数据库语法
  • 《OpenCV 计算机视觉》—— 视频背景建模
  • 【React】react hooks的使用规则
  • 基于深度学习的持续的知识积累与转移
  • golang学习笔记19-面向对象(一):面向对象的引入