数据结构与算法系列之kmp算法

news2024/11/15 18:35:27

在这里插入图片描述

什么是kmp算法

1.kmp算法是一种改进的字符串算法,其核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数已达到快速匹配的目的。
它主要实现作用的是 在 (主串)中找到 (匹配)字符串

在这里插入图片描述

BF算法与kmp算法的差别

bf算法如下所示 从首元素字符开始依次比较 ,如果相同则比较下一位元素,如果匹配失败 ,匹配字符串从头开始 ,主串从第二个字符开始比较,直到主字符串全部匹配完。如果匹配成功返回主字符串中第一次出现匹配字符串的位置。

在这里插入图片描述
在这里插入图片描述

kmp算法如下所示,kmp与bf不一样的地方在于:主串的所指向的字符不会后退,匹配串中所指向的也不会移动到首字符位置

在这里插入图片描述

在这里插入图片描述

kmp的回退规则,next数组的介绍

目的是使 指向主串字符不会回退 ,匹配串回退到一个特定位置
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这就是next数组的来源
规定next[0]=-1 next[1]=0
在这里插入图片描述

回退前提 : p[i] == p[k] 则 p[i] == p[k] next[i+1] == k+1 ,如果 p[i] != p[k] 则 next[k] != k, k==next[k] ,一直回退直到p[i] == p[k]

p[i] == p[k] 如下
在这里插入图片描述
p[i] != p[k]如下

在这里插入图片描述

kmp算法代码实现(C语言版)

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
void GetNext(char*sub, int* next ,int LenSub)
{
	next[0] = -1;
	next[1] = 0;
	int k = 0;
	int i = 2;
	while(i < LenSub)
	{
		if (k == -1 || sub[i - 1] == sub[k])
		{
			next[i] = k + 1;
			i++;
			k++;
		}
		else
		{
			k = next[k];
		}
	}
}
int KMP(char* str, char* sub, int pos)
{
	assert(str  && sub );
	int LenStr = strlen(str);
	int LenSub = strlen(sub);
	if (LenStr == 0 || LenSub == 0)
		return -1;
	if (pos < 0 || pos >= LenStr)
		return -1;

	int* next = (int*)malloc(sizeof(int) * LenSub);
	assert(next);
	GetNext(sub, next,LenSub);


	int i = pos;//主串
	int j = 0;//字串

	while (i < LenStr && j < LenSub)
	{
		if (j == -1 || str[i] == sub[j])
		{
			i++;
			j++;
		}
		else
		{
			j = next[j];
		}
	}
	if (j >= LenSub)
		return i - j;
	return -1;
}


int main()
{
	printf("%d", KMP("ababcabcdabcde", "abcd", 0));
		return 0;
}

在这里插入图片描述

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

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

相关文章

接口服务限流方案

一.限流方式1.中间件支持限流2.限流配置单台服务最大qps&#xff0c;通过令牌桶算法进行限流3.支持url前缀匹配二.配置1.文件配置qps 1000 //单台服务最大qpsrule "/ucenter" //限流识别前缀&#xff0c;如不配置为全局限流downgradeHttpStatus 200//降级方案返回…

PointNet++的源码运行

首先&#xff0c;从github上下载源码https://github.com/yanx27/Pointnet_Pointnet2_pytorch也可以从百度网盘下载链接&#xff1a;https://pan.baidu.com/s/1sgTYuqnBVC9p3bib450SOQ 提取码&#xff1a;gujd再下载对应的测试数据分类数据modelnet40_normal_resampled下载&…

UnRaid虚拟机安装OpenWrt软路由

文章目录0、前言1、Openwrt虚拟机安装1.1、前提&#xff0c;需要先在UnRaid中开启虚拟机&#xff1a;1.2、下载OpenWrt虚拟机镜像并上传至UnRaid共享文件夹1.3、创建OpenWrt虚拟机2、开启并设置OpenWrt虚拟机2.1、修改OpenWrt管理ip2.2、OpenWrt的上网设置0、前言 最近折腾了很…

扁桃体肥大对儿童有什么影响?怎么办及怎样才能消下去?

很多人不知道扁桃体肥大对孩子有什么影响。今天&#xff0c;李松培医生将向大家讲解这方面的知识。同时&#xff0c;他还将告诉大家如何消除扁桃体肥大扁桃体肥大对儿童有什么影响&#xff1a;事实上&#xff0c;说实话&#xff0c;扁桃体肥大对儿童的影响很大&#xff0c;因为…

最全Linux驱动开发全流程详细解析(持续更新)

Linux驱动开发详细解析 一、驱动概念 驱动与底层硬件直接打交道&#xff0c;充当了硬件与应用软件中间的桥梁。 具体任务 读写设备寄存器&#xff08;实现控制的方式&#xff09;完成设备的轮询、中断处理、DMA通信&#xff08;CPU与外设通信的方式&#xff09;进行物理内存…

Python爬虫(8)selenium爬虫后数据,存入sqlit3实现增删改查

之前的文章有关于更多操作方式详细解答&#xff0c;本篇基于前面的知识点进行操作&#xff0c;如果不了解可以先看之前的文章 Python爬虫&#xff08;8&#xff09;selenium爬虫后数据&#xff0c;存入sqlit3实现增删改查导入默认包和环境元素定位创建一个sqlit3表将爬虫到的信…

知识蒸馏综述笔记

知识蒸馏的目的 将学习能力强的复杂教师模型中的“知识”迁移到简单的学生模型中 1.知识蒸馏的背景知识 2.解释知识蒸馏的作用机制 3.归纳知识蒸馏中知识的不同形式 4.详细分析和对比了知识蒸馏的各种关键方法&#xff0c; 5.介绍知识蒸馏与其它技术融合、 6.对知识蒸馏…

VirtualBox 安装 CentOS 换成 Rocky Linux

1.下载 VirtualBox并安装https://www.virtualbox.org/wiki/Downloads2.下载Rocky Linux选择 Rocky-9.1-x86_64-dvd.iso 镜像 官网https://rockylinux.org/download阿里云镜像服务https://mirrors.aliyun.com/rockylinux/9.1/isos/x86_64/?spma2c6h.25603864.0.0.70c556799nMQL…

设计模式看 Spring。

设计模式看 Spring。 文章目录设计模式看 Spring。自定义 Spring 框架。7.1 Spring 使用回顾。7.2 Spring 核心功能结构。7.1.1 bean 概述。7.3 Spring IoC 相关接口分析。7.3.1 BeanFactory 解析。7.3.2 BeanDefinition 解析。7.3.3 BeanDefinitionReader 解析。7.3.4 BeanDef…

论文阅读 | Video Frame Synthesis using Deep Voxel Flow

前言&#xff1a; 视频帧生成方法&#xff08;视频插帧/视频预测&#xff09;ICCV2017 oral Video Frame Synthesis using Deep Voxel Flow 引言 当下进行视频帧合成的方法分为两种&#xff0c;第一种是光流法&#xff0c;光流准确的话效果好&#xff0c;光流不准确的话则生…

手摸手,带你实现3D粒子特效

文章摘要&#xff1a;某天&#xff0c;产品小姐姐找到我&#xff0c;要在页面上放一个动态3D模型…不会webGL&#xff1f;没关系&#xff01;今天就来聊一聊如何用从零实现3D粒子特效。 背景 近年来&#xff0c;随着互联网的迅速发展&#xff0c;用户对产品的视觉效果需求也更…

内网渗透(四十六)之横向移动篇-使用系统漏洞ms17010横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

leaflet 加载geojson数据,随机显示不同颜色的circleMarker

第086个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet项目中加载geojson数据,随机显示不同颜色的circleMarker. 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共89行)相关API专栏目标示例效果 配置方式…

时间序列数据预测的类型

本文主要内容是使用LSTM网络进行不同类型的时间序列预测任务&#xff0c;不涉及代码&#xff0c;仅仅就不同类型的预测任务和数据划分进行说明。 参考文章&#xff1a;https://machinelearningmastery.com/how-to-develop-lstm-models-for-time-series-forecasting/ 注&#xf…

如何使用Hugo Academic Theme构建自己的github主页

前期条件 自己已经注册好GitHub 原文档&#xff1a;https://wowchemy.com/docs/getting-started/hugo-github-quickstart/ 搜索Hugo Academic Theme&#xff08;网址&#xff09; 进入后的网址为&#xff1a;https://academic-demo.netlify.app/ 点击Get Start 出现如下模板…

【观察】昇腾加速AI“走深向实”,打通落地“最后一公里”

毫无疑问&#xff0c;今天AI正与产业结合得越来越紧密&#xff0c;从智能制造&#xff0c;到智慧医疗&#xff0c;智慧金融、智慧城市等&#xff0c;AI已经开始渗透到我们生活的方方面面&#xff0c;即便是目前来自传统行业用户的AI转型需求尚未完全激活爆发&#xff0c;但仅仅…

利用组件注解符精简Spring配置文件

文章目录利用组件注解符精简Spring配置文件一、利用组件注解精简Spring配置文件1、创建新包2、将4个类给拷贝过去3、修改杀龙任务类4、修改救美任务类5、修改勇敢骑士类6、修改救美骑士类7、创建Spring配置文件利用组件注解符精简Spring配置文件 一、利用组件注解精简Spring配…

什么是生命周期?Activity生命周期的三种状态

什么是生命周期生命周期就是一个对象从创建到销毁的过程&#xff0c;每一个对象都有自己的生命周期。同样&#xff0c;Activity也具有相应的生命周期&#xff0c;Activity的生命周期中分为三种状态&#xff0c;分别是运行状态、暂停状态和停止状态。接下来将针对Activity生命周…

【自动化测试】自动化测试框架那些事儿

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。在教学的过程中&#xff0c;同学们一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上一些实践&#xff0c;算是对“框架”有了一些理解…

JVM13 类的生命周期

1. 概述 在 Java 中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义&#xff0c;引用数据类型则需要进行类的加载。 按照 Java 虚拟机规范&#xff0c;从 class 文件到加载到内存中的类&#xff0c;到类卸载出内存为止&#xff0c;它的整个生命周期包…