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

KMP算法——我欲修仙(功法篇)

个人主页:【😊个人主页】
系列专栏:【❤️我欲修仙】
学习名言:莫等闲、白了少年头,空悲切。——岳飞


系列文章目录

第一章 ❤️ 学习前的必知知识
第二章 ❤️ 二分查找


文章目录

  • 系列文章目录
  • 前言🚗🚗🚗
  • BF算法
  • KMP算法
    • 介绍:
    • 算法主体
    • next[]数组
  • 总结:


前言🚗🚗🚗

进入修仙界你会遇见许多新奇事务,认识新的好友,还有许多奇遇,那么废话少说让我们进入到今天的冒险吧!

在这里插入图片描述


BF算法

BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。

在这里插入图片描述

int BF( char* b,  char* a)
{int i = 0, j = 0; int ret = i;//i用来控制主串,j用来控制子串,ret用来记录若有完整的匹配的字符串时,该字符串的起始位置//当主串和子串都不为'\0'时,进入循环进行比对while (*(b + i) && *(a + j)){//如果对应元素相同,则都指向下一位if (*(b + i) == *(a + j)){i++;j++;}//不同,则让i回到主串的上一次比较过的元素的第一个元素的后一元素,j赋为0,子串重新比对,//ret则等于新的起始位置else{i = i - j + 1;j = 0;ret = i;}}//若主串对应的元素为0,则代表遍历完成,主串没有与子串相匹配的字符串,if (*b == '\0'){return -1;}//if如果不执行,下面这个return便会执行。返回下标。return ret;
}

显然这种暴力的算法并不高效,于是KMP算法就诞生了。

KMP算法

介绍:

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)

KMP算法主要分为两部分:1.算法主体 2.获取next[]数组

算法主体

让我们忽略next[]的由来,只是关注算法主体,算法可以写成

int KMP_S(char *a,char *b,int Len_p,int Len_s)
{int i = 0, j = 0;int* next = build_next(b,Len_s);//获取next[]数组while (i < Len_p){if (*(a + i) == *(b + j)){i++;j++;}//如果两个数相同,这两个数组都向下移动   else if (j > 0)j = *(next+j-1);//非第一个字符,从跳过next数重新匹配elsei++;//第一个字符匹配时就失配if (j == Len_s)return i - j;//返回下标值}
}

请添加图片描述

next[]数组

next[]数值代表的是在匹配失败的时候字串中可以跳过匹配的字符个数,通过观察我们不难发现,我们跳过的字符与后面的字符完全相同,即前缀和后缀相同,所以我们可以认为next[]数组的本质就是寻找子串中“相同前后缀的长度,并且一定是最长的前后缀”(不包括其本身)
我们可以使用递归的方式去求解next[]数组:
请添加图片描述

int* build_next(int* b, int Len_s)
{int i, j = 0;int next[MAX] = { 0 };for (i = 1;i < Len_s;i++){while (j > 0 && *(b + i) != *(b + j)){j = next[i - 1];}if (*(b + i) == *(b + j)){next[i] = j;}}return next;
}

总结:

KMP算法比较难以理解,我发现网上大部分讲解KMP算法的文章都比较难懂事实上在这方面我认为还是通过动画视频的方式可以更加直观的认识到KMP算法的运算方式。
这里我推荐:最浅显易懂的 KMP 算法讲解

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#define MAX 100
int next[MAX] = { 0 };
/*int* build_next(int* b, int Len_s)
{int i, j = 0;int next[MAX] = { 0 };for (i = 1;i < Len_s;i++){while (j > 0 && *(b + i) != *(b + j)){j = next[i - 1];}if (*(b + i) == *(b + j)){next[i] = j;}}return next;
}*/
int* build_next(char* b, int Len_s)
{int next[MAX] = { 0 };int len = 0, i = 0;while (i < Len_s){if (*(b + len) == *(b + i)){len++;next[i] = len;i++;}else if (len == 0){next[i] = 0;i++;}elselen = next[len - 1];}return next;}//求解next*/
int KMP_S(char *a,char *b,int Len_p,int Len_s)
{int i = 0, j = 0;int* next = build_next(b,Len_s);while (i < Len_p){if (*(a + i) == *(b + j)){i++;j++;}//匹配成功向下移动   else if (j > 0)j = *(next+j-1);//非第一个字符,从跳过next数重新匹配elsei++;//第一个字符匹配时就失配if (j == Len_s)for (;j < i;j++){printf("%c", *(a + j));return i - j;}}
}
int main()
{char Pst[MAX] = { 0 };char Sst[MAX] = { 0 };int Len_p = 0;int Len_s = 0;fgets(Pst, MAX, stdin);getchar();fgets(Sst, MAX, stdin);Len_p = strlen(Pst)-1;Len_s = strlen(Sst);printf("%d %d\n", Len_p, Len_s);KMP_S(Pst, Sst,Len_p,Len_s);return 0;
}

在这里插入图片描述
(部分文字与图片来源于网络,侵权请联系删除)

相关文章:

KMP算法——我欲修仙(功法篇)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️我欲修仙】 学习名言&#xff1a;莫等闲、白了少年头&#xff0c;空悲切。——岳飞 系列文章目录 第一章 ❤️ 学习前的必知知识 第二章 ❤️ 二分查找 文章目录系列文章目录前言&#x1f697;&…...

【嵌入式Linux学习笔记】QT在Linux嵌入式设备上的使用

QT是目前主流的UI界面设计软件之一&#xff0c;Linux系统也支持QT应用&#xff0c;并且提供了很多方便的接口。所以有必要记录一下基于QT&#xff0c;在LCD屏幕上实现UI界面功能的各种细节。 学习视频地址&#xff1a;【正点原子】STM32MP157开发板 1. 系统配置 出于方便&am…...

js根据数据关键字实现模糊查询功能

js根据数据关键字实现模糊查询功能模糊查询实现模糊查询功能的步骤和一般方法第一步&#xff1a;创建假数据或请求接口数据第二步&#xff1a;分析数据格式&#xff0c;处理数据第三步&#xff1a;验证功能完整代码模糊查询 模糊查询功能是指在搜索或者查询时&#xff0c;允许…...

java获取对象属性

Field[] fields vo.getClass().getDeclaredFields(); for (Field field : fields) {//设置允许通过反射访问私有变量field.setAccessible(true);//获取字段的值String value "";Class<?> type field.getType();if (Date.class.equals(type)) {value DateU…...

51单片机(IIC协议OLED屏)

一、IIC协议 1、IIC协议概述 1.1、概述&#xff1a;IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线&#xff0c;用于连接微控制器及其外围设备。IIC属于半双 工同步通信方式 1.2、特点&#xff1a;简单性和有效性。 由于接口直…...

你知道,华为对项目经理要求的3项技能5项素质是什么吗?

很多人一定在好奇&#xff0c;华为对项目经理的要求是什么呢&#xff1f;普通项目经理应具备什么素质&#xff0c;才能进入华为这样的大厂&#xff0c;在严峻的经济形势下无惧裁员呢&#xff1f; 一、三项软技能 我们在华为举办的项目经理论坛中找到了答案&#xff1a;对于华…...

优漫动游 提升效率常用的C4D技巧

C4D是近几年非常热的趋势&#xff0c;经常有人问3D相关的问题&#xff0c;想把自己在找捷径的过程中觉得最实用的小技巧分享给大家   1、快速定位层级和模型   模型的过程中&#xff0c;经常遇到模型层级多难定位的问题&#xff0c;逐级打开或者全部展开对于定位模型使…...

基于蚁群算法的时间窗口路径优化

目录 背影 蚁群算法的原理及步骤 基本定义 编程思路 适应度函数 算法的规则 特点 主要参数 代码 结果分析 展望 背影 现代物流配送对时间要求更高,是否及时配送是配送是否成功的重要指标,本文对路径优化加时间窗口,实现基于蚁群算法的时间窗口路径优化, 蚁群算法 基本…...

liunx

linux常用命令 mkdir &#xff1a;创建文件夹 rm -f &#xff1a;删除文件 docker cp 文件名 20f:容器内地址 将文件从linux系统移动到docker地址 ln -s 将两个文件做链接 compgen -u 查看所有用户 groups 查看所在组 vim 编辑 quit 退出 sudo su - root 获得root权限 cp dir1/…...

机动车发票组件【vue】

发票组件 问题反馈&#xff1a;在这就可以 Install-下载 npm install motorvehicles --savewarrning&#xff1a;我们推荐您设置key的&#xff0c;因为不存在它会带来数据的复用性问题usage-使用说明 import MotorVehiclesIvoice from motorvehiclesimport MotorVehiclesIvo…...

学习笔记-剖析k8s之StatefulSet的拓扑状态-3月day18

文章目录前言StatefulSetHeadless ServicePod的拓扑状态小结附前言 Deployment实际上并不足以覆盖所有的应用编排问题&#xff0c;原因在于Deployment对应用做了一个简单化的假设&#xff1a;一个应用的所有Pod&#xff0c;是完全一样的。所以&#xff0c;它们互相之间没有顺序…...

Java实现输出九九乘法口诀表,输入行数输出对应的梯形(平行四边形)这两个代码

目录 一、前言 二、代码部分 1.输出九九乘法口诀表的代码 三、程序运行结果&#xff08;控制台输出&#xff09; 一、前言 1.本代码是我在上学时写的&#xff0c;有一些地方没能完美实现&#xff0c;请包涵也请多赐教&#xff01; 2.本弹窗界面可以根据简单的要求进行输…...

C++空间配置器

目录 1.什么是空间配置器 2.为什么需要空间配置器 3.SGI-STL空间配置器实现原理 3.1一级空间配置器 3.2二级空间配置器 3.2.1内存池 3.2.2 SGI-STL中二级空间配置器设计 3.3 空间配置器的默认选择 4.空间配置器与容器的结合 1.什么是空间配置器 空间配置器&#xff0…...

JConsole使用教程

JConsole是一个Java虚拟机的监控和管理工具&#xff0c;可以监控Java应用程序的内存使用、线程和类信息等。 以下是JConsole的使用教程&#xff1a; 1.启动JConsole JConsole是一个Java自带的工具&#xff0c;可以在bin目录下找到jconsole.exe文件。双击运行该文件即可启动JC…...

JS手写防抖和节流函数(超详细版整理)

1、什么是防抖和节流防抖&#xff08;debounce&#xff09;&#xff1a;每次触发定时器后&#xff0c;取消上一个定时器&#xff0c;然后重新触发定时器。防抖一般用于用户未知行为的优化&#xff0c;比如搜索框输入弹窗提示&#xff0c;因为用户接下来要输入的内容都是未知的&…...

我的Macbook pro使用体验

刚拿到Mac那一刻&#xff0c;第一眼很惊艳&#xff0c;不经眼前一亮&#xff0c;心想&#xff1a;这是一件艺术品&#xff0c;太好看了吧 而后再体验全新的Macos 系统&#xff0c;身为多年的win用户说实话一时间还是难以接受 1.从未见过的访达&#xff0c;不习惯的右键 2. …...

炼石入选“首届工业和信息化领域商用密码应用峰会”典型方案

2023年3月22日-23日&#xff0c;浙江省经济和信息化厅、浙江省通信管理局、浙江省密码管理局、工业和信息化部商用密码应用产业促进联盟联合举办的“首届工业和信息化领域商用密码应用峰会”&#xff08;以下简称峰会&#xff09;在浙江杭州成功举办&#xff0c;旨在深入推进工…...

使用new bing chat成功了

步骤一:在扩展商店搜索并安装modheader 打开浏览器; 点击右上角的三个点图标,选择“更多工具” -> “扩展程序”; 在扩展程序页面上方的搜索框中输入“modheader”,然后点击“搜索商店”; 在搜索结果中找到“ModHeader”扩展程序,点击“添加至”按钮,然后再点击“添…...

Golang每日一练(leetDay0019)

目录 55. 跳跃游戏 Jump Game &#x1f31f;&#x1f31f; 56. 合并区间 Mmerge Intervals &#x1f31f;&#x1f31f; 57. 插入区间 Insert Interval &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练…...

记录一次性能测试遇到的问题

零、压测指标问题 压测指标&#xff0c;一定要需求方定 啊&#xff0c;谁提压测需求&#xff0c;谁来定压测指标。 如果需求方&#xff0c;对压测指标没有概念&#xff0c;研发和测试&#xff0c;可以把历史压测指标、生产数据导出来给需求方看&#xff0c;引导他们来定指标&…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...