2022/1/6总结

news2024/12/30 3:02:15

今天学习了KMP算法。 

KMP算法

这是一个字符串查找的算法,我们之前学习的字符串查找都是暴力穷举,然而这个效率太低,于是有三位大佬发明了线性的KMP算法。

算法说难不难,说简单也不简单。

算法的核心思想是找到最长的相等的前缀和后缀,然后可以直接跳到后缀的部分,继续进行比较,让母串的i不回退,从而减少复杂度。

打一个比方:

如果子串和母串是上面这个样子,如果用暴力会做一些无用功,因为他到B的位置也一定不同。

当我们比对到3的位置时,最长的前缀和后缀是 A,在4的下标时,就比对不上了。

我们可以直接把子串移到3的位置,然后在母串的i 不变,j在4 的位置继续比较,我们发现j在4的位置是不匹配的,这里有一个重点:就是前缀和后缀的长度是不能大于等于前面字符的长度的,前面的长度是1,前缀和后缀恰好都是A,这是不行的。

然后就是这样:

继续往后走:

全部匹配。

那么重点来了:我们如何确立我们要跳的距离呢,这里说的是子串的 j位置。

这里就要借助next数组了,next数组存储的是你要跳的距离,next数组是针对子串的,所以next数组应该和子串长度相当,我看过很多博主说过next数组,有些是从1开始存储有些人是从0,有些人next数组下标第一个和第二个存储的是0 1,而有些人不然。我认为,从0 1全看个人喜好,觉得能够理解就行。

接下来讲一讲next数组如何存放:

next1的位置的时候,因为不允许前缀和后缀长度大于等于前面字符的,所以第一个位置是0

J往后走,此时很明显j的和k的起始位置相比,也就是AB比较是不相等的,此时next数组2的位置上是0

然后j到了3的位置,我们发现j的位置和k位置的字符是相等的,所以我们在next数组3的位置写上1并且k往后走。

然后j会走到4的位置此时j的位置和k所在的位置是相等的,那么next数组第4个位置的地方存储的是2

这里还没列出一个特殊情况。

比如:

当继续执行的时候,j++,k++,然后我们发现我们找的是前缀和后缀,此时不相等了,该怎么办,这个时候我们就要执行k=next[k]操作使它回退到A的初始位置1 然后继续比较即可。

这中情况会一直推到1的位置再开始比较。

C语言代码如下:(我代码写的是next数组从0开始存储,这个看个人喜好)

#include<stdio.h>
#define N 200
int js(char a[],int next[])
{
	int i,j=0;
	next[0]=0;
	for(i=1;a[i];)
	{
		if(a[i]==a[j])
		{
			j++;
			next[i]=j;
			i++;
				
		}
		else if(j==0)
		{
			next[i]=j;
			i++;
		}
		else 
		{
			j=next[j];
		}
	}
}
int kmp(char a[],char b[])
{
	int i,j=0;
	int next[N]={0};
	js(b,next);
	for(i=0;a[i];)
	{
		if(a[i]==b[j])
		{
			i++;
			j++;
		}
		else if(j==0)
		{
			i++;
		}
		else
		{
			j=next[j-1];
		}
		if(b[j]==0) return i-j+1;
	}
	return -1;
}
int main()
{
	char str1[N],str2[N];
	scanf("%s%s",str1,str2);
	printf("%d\n",kmp(str1,str2));
	return 0;
}

 C++代码如下:

#include<iostream>
#include<bits/stdc++.h>

using namespace std;

const int N = 200;

int js(char a[], int next[]) 
{
	int i, j = 0;
	next[0] = 0;
	for (i = 1; a[i];) 
	{
		if (a[i] == a[j]) 
		{
			j++;
			next[i] = j;
			i++;

		} else if (j == 0) 
		{
			next[i] = j;
			i++;
		} else 
		{
			j = next[j];
		}
	}
	return 0;
}
int kmp(char a[], char b[]) 
{
	int i, j = 0;
	int next[N] = {0};
	js(b, next);
	for (i = 0; a[i];) 
	{
		if (a[i] == b[j]) 
		{
			i++;
			j++;
		} 
		else if (j == 0) 
		{
			i++;
		} 
		else 
		{
			j = next[j - 1];
		}
		if (b[j] == 0) return i - j + 1;
	}
	return -1;
}
int main() 
{
	char str1[N], str2[N];
	cin >> str1 >> str2;
	cout << kmp(str1, str2) << endl;
	return 0;
}

 

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

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

相关文章

Struts2框架之Action配置

Struts2框架之Action配置Action配置1、访问Action的三种方式1.1、method属性访问1.2、Action动态方法调用1.3、通配符调用2、配置默认的ActionAction配置 Action控制器在Struts2框架中至关重要&#xff0c;主要作用如下&#xff1a; 封装工作单元数据转移的场所返回结果字符串…

(黑马C++)L07 多态

一、多态的基本概念 多态是面向对象程序设计语言中除数据抽象和继承之外的第三个基本特征。 多态&#xff1a;父类的引用或者指针指向子类对象 C支持编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&#xff09;&#xff0c;运算符重载和函数重…

纷享销客CRM让科顺营销人更容易呼唤到“炮火”

希望让听得见“炮声”的人&#xff0c;更容易呼唤到“炮火”。对于在一线做营销的人而言&#xff0c;他们就是听到“炮声”的人。让一线的人员听得到“炮声”也就是销售线索、商机&#xff0c;能呼唤到“炮火”也就是呼唤到他们需要的资源。这恐怕是所有营销人都希望达到的境界…

ubuntu Ad-Hoc组网通信

目录 WIFI通信的多种组网方式 1、AP模式 2、Ad-hoc模式 ubuntu18配置ad-hoc模式 WIFI通信的多种组网方式 1、AP模式 最常用的模式&#xff0c;需要一个节点&#xff08;一般是路由器&#xff09;作为AP&#xff0c;其他节点连接到这个AP产生的wifi网络。通信拓扑是星形&a…

11_6、Java集合之Map接口的使用

一、引入Map与Collection并列存在。用于保存具有映射关系的数据:key-value &#xff08;双列集合框架&#xff09;&#xff0c;Map 中的 key 和 value 都可以是任何引用类型的数据 。Map 中的 key 用Set来存放&#xff0c;不允许重复&#xff0c;即同一个 Map 对象所对应 的类&…

在rhel6系统部署iscsi远程存储

文章目录一 需求二 环境准备三 服务端配置3.1 添加硬盘3.2 安装软件3.3 编写配置文件3.4 启动服务3.5 检查配置信息四 客户端配置4.1 安装软件包4.2 启动服务4.3 发现目标4.4 登陆目标4.5 实现开机自动挂载五 对部署进行测试一 需求 1&#xff09;首先在服务端添加一块10G的硬…

实验二十二 配置访问控制列表AGL

实验二十二 配置访问控制列表AGL一、 ACL基础概念 1、访问控制列表根据源地址、目标地址、源端口或目标端口等协议信息对数据包进行过滤&#xff0c; 从而达到访问控制的目的 。可以在路由器、三层交换机等设备上使用 &#xff0c;目前部分新二层交换 机也支持ACL。 2、ACL由编…

十、k8s DashBoard

文章目录1 部署Dashboard2 使用DashBoard之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实&#xff0c;为了提供更丰富的用户体验&#xff0c;kubernetes还开发了一个基于web的用户界面&#xff08;Dashboard&#xff09;。用户可以使用Dashboard部署容…

超级浏览器的技术原理,超级浏览器的浏览器指纹是什么?

浏览器指纹是超级浏览器的识别信息&#xff0c;网站可以通过这些信息来识别用户&#xff0c;判断用户的唯一性。常见的浏览器指纹有IP地址、浏览器所在地区、时区&#xff1b;用户代理&#xff08;User Agent&#xff09;相关的操作系统及版本、CPU 类型、浏览器及版本、浏览器…

吴恩达《机器学习》——PCA降维

PCA降维1. 主成分分析1.1 数据降维动机1.2 PCA降维目标问题分析2. PCA数学原理分析2.1 求协方差矩阵的碎碎念2.2 PCA实现方法3. Python实现3.1 进行人脸数据压缩数据集、源文件可以在Github项目中获得 链接: https://github.com/Raymond-Yang-2001/AndrewNg-Machine-Learing-Ho…

一些实用的办公工具分享给你

ABBYY FineReader 这是一个可以转换PDF格式的图片文字识别软件&#xff0c;下载之后可以免费试用七天&#xff0c;或者选择去它的网站上传PDF进行识别转换&#xff0c;一天最多可以转换10次&#xff0c;且一次只能转换3个页面。 【操作方法】 打开软件&#xff0c;点击“图像…

(day3)自学Java——面向对象

非原创&#xff0c;为方便自己后期复习 目录 1.类和对象 2.封装 3.就近原则和this关键字 4.构造方法 5.标准的javabean类 6.三种情况的对象内存图 7.基本数据类型和引用数据类型 8.this的内存原理 9.面向对象综合训练 (1)文字版格斗游戏 (2)两个对象数组练习 (3)对…

产品上新|语音识别+主题抽取,Magic Data多人会议数据集助您打造领先智能会议系统

2020年以来&#xff0c;新冠加快了线下向线上搬迁的速度&#xff0c;使得线上办公、在线教育、远程会议得到飞速普及和发展。艾媒咨询数据显示&#xff0c;2021年中国视频会议行业市场规模达148.2亿元。各类视频会议产品价格较低、操作便捷高效&#xff0c;普及率越来越高&…

vsftp开启登录,上传,下载,删除等操作审计日志

vsftp开启登录&#xff0c;上传&#xff0c;下载&#xff0c;删除等操作审计日志 背景 今天业务告知说有人把前天下午和昨天一天的ftp上面的附件被人删除了&#xff0c;首先我是非常的惊讶&#xff0c;居然会发生这种事&#xff0c;但是好在这个ftp不是我们负责的&#xff0c;…

驱动之设备模型

1. 起源与新方案 1.1 起源 仅devfs&#xff0c;导致开发不方便以及一些功能难以支持 热插拔不支持一些针对所有设备的同意操作&#xff08;如电源管理&#xff09;不能自动mknod用户查看不了设备信息设备信息硬编码&#xff0c;导致驱动代码通用性差&#xff0c;即没有分离设…

终章:学习路线

说明 该文章来源于徒弟lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明一些废话成果路线第一阶段要点第二阶段要点第三阶段要点第四阶段要点最后一些废话 截至这篇文章前已经有150star了&#xff0c;虽然比不上大佬们K级的量…

【链表】leetcode203.移除链表元素(C/C++/Java/Js)

leetcode203.移除链表元素1 题目2 思路 (两种方式&#xff09;2.1 在原来链表上进行删除2.2 设置一个虚拟头结点删除3 代码3.1 C &#xff08;两种方式&#xff09;3.2 C版本&#xff08;两种方式&#xff09;3.3 Java版本&#xff08;两种方式&#xff09;3.4 JavaScript版本4…

Vue的组件、组件的创建、data、methods

一、组件 组件是vue的重要的特征之一&#xff0c;可以扩展html的功能&#xff0c;也可以封装代码实现重复使用。 二、组件的创建 1. 非脚手架方式下创建 ​ 第一步&#xff1a;使用Vue.extend创建组件 ​ 第二步&#xff1a;使用Vue.component注册组件 ​ …

OpenGov(三):新波卡治理机制有哪些可期待?

OpenGov维持波卡开创的信念投票&#xff0c;与以前相同的方式进行&#xff0c;使用WebAssembly和几个链上投票机制。也就是说&#xff0c;OpenGov通过降低障碍&#xff0c;来更好地管理网络的日常决策&#xff0c;将流程推向去中心化。真正的重点是使提案的范围与通过治理流程的…

企业数字化转型到底是什么?

企业的数字化转型单单是从基础设施上变更&#xff0c;更要从企业数据从文化上入手&#xff0c;培养企业的数据文化&#xff0c;以数据驱动来促进业务发展。大家都把数据基础设施讲的很详细了&#xff0c;那么我就从企业的数据化转型当中的数据文化是什么&#xff1f;以下来为大…