数据结构—KMP 算法:

算法思想:

KMP算法实现寻找主串中子串的位置时,主串指针地址不回退,在比对过程中串仅仅遍历一次,子串的回退可以是与当前主串可重新最多匹配的地址位置。

BF与KMP算法比对:

KMP

BF

主串不用回退

主串回退,回退到此次开始比较的下一位置

子串的回退可以是与当前主串可重新最多匹配的地址位置

子串回退到开始位置

思路展示:

1、首先遍历主串中与子串一致的字符,直至出现无法匹配:

如图:主串与子串的粉色阶段相同,而后面的无法匹配

2、当我们发现,在主串与子串相同的部分内,主串后一部分与子串前一部分相同

如图:主串与子串紫色部分相同

可以设想一下,子串是否可以从紫色结尾的地方重新和主串的当前位置再次做匹配

3、由步骤一则知道,主串与子串粉色部分相同,步骤二引入紫色部分相同,则可以推导出:

推导出:子串的前一部分与子串的后一部分相等

4、由思路推出表达式:

  • 子串此次匹配的结束地址下标位置为 j;
  • 开始下标:0;
  • 紫色结束下标:k-1;
  • 由紫色部分长度、字符都相等,所以长度: k-1-0=j-1-紫色开始下标;
  • 所以紫色开始下标:j-k;

结论:

匹配成功的子串片段中,寻找两个最长且相等的真子串,真子串长度决定子串返回的地址下标

真子串特点:

  1. 一真子串以子串的开头为开头
  2. 另一真子串以子串匹配片段的结尾为结尾
  3. K为子串的长度,也是子串在匹配失败时需要返回的位置

next数组及其练习(重点)

我们由上一个结论所得的K 值,保存得到的数组(next数组)

固定值:

        next[0]=-1;    next[1]=0;

易错:

        1、子串的截断字符不包含在此次子串片段范围内,当前的截断字符的next数组值,由截断前的所有字符作为判断决定

请判断:

        红色为标准错误,绿色为正确答案

        2、子串的真子串比对容易漏掉最长真子串

        红色为标准错误,绿色为正确答案

练习例子:

1:"abacdabcabaae"

      -1001001201231

2:"abacdabcabcde"

      -1001001201200

寻找next[]的固定规律:

  • 当我们已知下标为i 的next数组的值时:next[i]=k;
  • 需要判断子串str[]:str[k] 与 str[i] 是否相等?
  1. 相等: next[++i]=++k;
  2. 不相等:

        此时问题则迭代成为在当前已经遍历的字符串中寻找最长的相等真子串

                ->求当前 str[i+1] 对应的 next数组值

                ->即为 next[k]对应的next数组值

                -> next[++i]=next[k]

KMP算法的实现:

#include <iostream>
#include <string>
#include<assert.h>
using namespace std; 

//KMP 算法,i 不回退
//思路:
//下标: j-k ...j-1 = 0...k 
//找子串的两个最长真子串!首位两个真子串
//真子串长度为k;(next 数组)
//!注意,当前位置为截断不等位置,此位置的前一个位置为尾


int BF(const char* str1, const char* str2, int pos)
{
	assert(str1 != NULL && str2 != NULL);
	int len1 = strlen(str1);
	int  len2 = strlen(str2);

	int* next = (int*)malloc(sizeof(int) * len1);
	next[0] = -1;
	next[1] = 0;
	int i = 1;
	int k = 0;
	while (i+1 < len1)
	{
		
		if ((k == -1) || str1[i] == str1[k])
			next[++i]= ++k;
		else
			k=next[k];
	}

	if (pos < 0||pos>=strlen(str1)||str1==NULL||str2==NULL)
		return -1;

	int j = 0;
	i = pos;
	while(i<len1&&j<len2)
	{
			if ((j==-1)||(str1[i] == str2[j]))
			{
				i++;
				j++;
			}
			else
			{
				//KMP 算法:i保留在当前位置,与j 再次比较
				j = next[j];
				/*BF 算法:j = 0;  i = i - j + 1;*/
			}
	}
	if (j == len2)
		return i - j;
	return -1;
}

int main()
{
	const char *str1 = "ababcabcdabcdeabcdabcdd";
	//const char* str1 = "abcd";
	const char* str2 = "abcd";
	int i = 0;
	int j =0;
	j = BF(str1, str2, j);
	while(j!=-1)
	{
		 j = BF(str1, str2, j);
		printf("返回类比pos位置:%d\n", j);
		if (j == -1)
			break;
		j += strlen(str2);
	}
	return 0;
}

时间复杂度:

  1. KMP:O(m+n);主串只遍历一次
  2. BF: O(m*n)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新规正式发布 | 百度深度参编《生成式人工智能服务安全基本要求》

2024年2月29日&#xff0c;全国网络安全标准化技术委员会&#xff08; TC260 &#xff09;正式发布《生成式人工智能服务安全基本要求》&#xff08;以下简称《基本要求》&#xff09;。《基本要求》规定了生成式人工智能服务在安全方面的基本要求&#xff0c;包括语料安全、模…

【three.js】22. Imported Models导入模型

22. Imported Models导入模型 介绍 Three.js 可以让你创建很多原始几何体&#xff0c;但是当涉及到更复杂的形状时&#xff0c;我们最好使用专用的 3D 软件建模。 在本课中&#xff0c;我们将使用已经制作好的模型&#xff0c;但我们将在以后的课程中学习如何完全在 3D 软件中…

强化学习中动作价值函数和状态价值函数的联系区别?

在强化学习中&#xff0c;动作价值函数&#xff08;Q函数&#xff09;和状态价值函数&#xff08;V函数&#xff09;都是值函数&#xff0c;用于评估在不同状态或状态动作对下的值。它们之间存在联系&#xff0c;但有一些区别&#xff1a; 动作价值函数&#xff08;Q函数&#…

STM32CubeIDE基础学习-相关工程文件介绍

STM32CubeIDE基础学习-相关工程文件介绍 前言 保存的工程要大致了解熟悉里面的文件代表的是什么意思、干什么用的&#xff0c;这样才方便后面使用或移植代码等。 当成功创建工程后&#xff0c;打开基础工程保存路径后可以看到所有文件如下图所示&#xff1a; 如果工程越复杂&a…

DDR ECC的使用

DDR ECC的使用 DDR注入错误测试 DDR先刷一遍0&#xff0c;ECC_STATUS&#xff0c;ECC_ON_OF初始化为0&#xff0c;数据注入错误&#xff0c;写DDR&#xff0c;读DDR。 ECC_STATUS 该寄存器保存有关可纠正和不可纠正错误发生的信息。状态位独立地设置为1&#xff0c;表示每种错…

MySQL--优化(索引--聚簇和非聚簇索引)

MySQL–优化&#xff08;索引–聚簇和非聚簇索引&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 一、聚簇索引 聚簇索引&#xff1a;将数据存储与索引放到了一块&#xff0c;索引结构的叶子节点保存…

鸿蒙 自定义弹窗对CustomDialogController二次封装

前言&#xff1a; 鸿蒙官方提供了自定义customdialog&#xff0c;调用代码很臃肿&#xff0c;必须在当前页面创建customDialogController&#xff0c;否则无法正常弹窗dialog 解决方案&#xff1a;目前就定义了两种类型的dialog 具体代码如下&#xff1a; 1. 用于代理dialog的…

从安卓转战月薪6万的鸿蒙原来这么简单

近年来&#xff0c;各家大厂正在积极布局鸿蒙客户端开发&#xff0c;鸿蒙操作系统备受瞩目&#xff0c;不少安卓开发者纷纷转战鸿蒙&#xff0c;并取得了可观的经济回报。本文将为大家揭示&#xff0c;从安卓转战鸿蒙并获得月薪6万的简单之道&#xff0c;希望能给正在考虑转型的…

亿发解析:互联网浪潮席卷,新零售崛起成为未来十年无可忽视之势

随着人们消费能力和水平的提高&#xff0c;消费者对产品质量的关注已不再仅限于产品本身&#xff0c;而更加强调产品质量与消费服务体验的双重重要性。随着互联网、移动支付、快递物流等技术的发展&#xff0c;这些技术催生了零售领域的新模式、新经济和新业态&#xff0c;为新…

四信5G FWA家族再添猛将,让你一眼沦陷的5G CPE来了!

随着全球5G基础设施建设的日益完善&#xff0c;千行百业迎来巨大变革&#xff0c;越来越多的场景因为5G网络实现跨越式升级&#xff0c;人们生活早已离不开超高速的互联网连接。 5G FWA作为弥合光纤欠发达地区数字鸿沟挑战的“杀手级应用”&#xff0c;摆脱对传统有线网络基础设…

图形报表ECharts

1、 ECharts简介 ECharts缩写来自Enterprise Charts&#xff0c;商业级数据图表&#xff0c;是百度的一个开源的使用 JavaScript实现的数据可视化工具&#xff0c;可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大 部分浏览器&#xff08;IE8/9/10/11&#xff0c;Ch…

ubuntu下使用MATLAB过程中的若干问题

ubuntu版本&#xff1a;Ubuntu 20.04 内核&#xff1a;Linux 5.15.0-97-generic MATALB版本&#xff1a;MATLAB R2022b 问题1&#xff1a;运行脚本时闪退 报错信息&#xff1a; Inconsistency detected by ld.so: ../elf/dl-tls.c: 517: _dl_allocate_tls_init: Assertion l…

vue-cli项目因为webpack版本不兼容运行后报错

vue-cli项目运行后报错&#xff1a; Error: Rule can only have one resource source (provided resource and test include exclude) in {"exclude": [null],"use": [{"loader": "G:\\CustomerDay\\customerday\\node_modules\\cache-l…

制片管理工具:提高制片效率的必备工具

一、什么是制片管理工具 制片管理工具是一种为制片人提供支持和协助的软件或工具&#xff0c;并提供一种集中管理制作进度、任务分配、成本预算、资源管理和进度跟踪的方式。它可以帮助制片人在项目的开发、制作和发布方面更有效地进行规划和监督&#xff0c;确保整个流程能够…

redis-集群 原生部署和工具自动部署

什么redis集群&#xff1f; redis集群是一个提供在多个redis节点之间共享数据的程序集。它并不像redis主从复制模式那样仅提供一个master节点来提供写服务&#xff0c;而是会提供多个master节点来提供写服务&#xff0c;每个master节点中存储的数据都不一样&#xff0c;这些数据…

buildadmim生成代码时让菜单有层级

当我们使用buildadmin生成代码的时候&#xff0c;在菜单的部分&#xff0c; 有时希望它生的是一个带有层级的菜单&#xff0c;有时候则想生成一个没有层级的菜单 like this 经过本人测试 如果我们要生成没有层级的菜单 我们可以在高级设置中的 相对位置处更改&#xff0c;同时…

O2O:Adaptive policy learning for offline-to-online reinforcement learning

AAAI2023 paper Introduction 传统Online RL需要智能体与环境进行海量交互&#xff0c;而Offline RL容易受限于数据集质量。因此本文提出一种O2O的自适应策略学习框架APL。APL在离线阶段悲观更新策略而在现阶段乐观更新。进一步&#xff0c;基于框架分别提出value-based 以及…

蓝牙APP开发实现汽车遥控钥匙解锁汽车智能时代

在现代社会&#xff0c;随着科技的不断发展&#xff0c;汽车已经不再是简单的交通工具&#xff0c;而是与智能科技紧密相连的载体。其中&#xff0c;通过开发APP蓝牙程序实现汽车遥控钥匙成为了一种趋势&#xff0c;为车主带来了便捷与安全的体验。虎克技术公司作为行业领先者&…

Redis6 搭建主从集群架构

文章目录 搭建Redis主从集群架构1.集群结构2.准备实例和配置3.启动4.开启主从关系5.测试 搭建Redis主从集群架构 安装部署单机版Redis6可参考&#xff1a; 安装部署单机版Redis6 1.集群结构 我们搭建的主从集群结构如图&#xff1a; 我们计划是在一台虚拟机里去部署三个R…

区块链媒体套餐:精益求精链游媒体宣发推广7个关键细节分享-华媒舍

在如今竞争激烈的游戏行业&#xff0c;一款优秀的游戏缺乏有效的宣发推广&#xff0c;很难脱颖而出。而随着区块链技术的兴起&#xff0c;链游媒体的宣发推广成为游戏开发者和运营商的重要选择之一。本文将为大家介绍精益求精的链游媒体宣发推广的七个关键细节。 1. 定位目标受…