KMP算法【数据结构】
KMP算法
KMP算法是一种改进的字符串匹配算法
- Next[j] = k :一个用来存放子串返回位置的数组,回溯的位置用字母k来表示。
- 其实就是从匹配失败位置,找到他前面的字符串的最大前后相等子串长度。
- 默认第一个k值为-1(Next[0] = -1),第二个k值为0(Next[1] = 0),我们只需要从第三个k值(Next[2])开始求
- next数组的长度与子串的长度相同

- arr2[k] == arr2[j] ⇒ Next [ j+1 ] = k + 1

- 此时令j = 5那已知信息就有 arr[j] = ‘a’,Next[j] = k = 2, arr[k] = ‘c’,此时arr[j] != arr[k]

- 那我们就让新的 k = Next[ k ] = 0
- 一直都找不到,那我们此时k肯定回溯到了数组头部,即k = - 1处,那我们就停止回溯, Next [ j + 1 ] = k + 1 ⇒ Next [ j + 1] = 0
#include<stdio.h>
#include<string.h>//获得Next数组
void GetNext(int* Next, const char* arr2) //传入Next数组地址,传入子串首地址
{//初始已知项 j = 1int j = 1;//i从2开始求 int i = j + 1;//此时k为0 int k = 0; //子串长度int len2 = strlen(arr2); //Next数组前两个默认值Next[0] = -1; Next[1] = 0;while (i < len2) {if ((k == -1) || arr2[k] == arr2[i - 1]) {Next[i] = k + 1;k = k + 1; i++; }else{k = Next[k]; }}
}//KMP算法
int KMP(char* arr1, char* arr2)
{int i = 0; int j = 0; int len1 = strlen(arr1);int len2 = strlen(arr2);int* Next = (int*)malloc(len2 * sizeof(int)); //为Next数组开辟一个与子串一样长的 //空间//借用Next函数得到Next数组的内容GetNext(Next, arr2); if (len1 == 0 && len2 == 0 || len2 == 0) return 0;else if (len1 == 0 || len2 > len1) return -1; //当arr1和arr2都没走到尽头 while (i < len1 && j < len2) {if (arr1[i] == arr2[j]){i++;j++;}else{//j回溯j = Next[j]; }}//子串全部找到了if (j >= len2)return i - j; //开始匹配时的位置return -1; //否则就是主串走到尽头,代表没找到
}int main()
{char arr1[] = "abababcabc"; char arr2[] = "abcabc";char pos;pos = KMP(arr1, arr2);printf("%d", pos);
}
优化
先来看一个例子:
主串s=“aaaaabaaaaac”
子串t=“aaaaac”
这个例子中当‘b’与‘c’不匹配时应该‘b’与’c’前一位的‘a’比,这显然是不匹配的。'c’前的’a’回溯后的字符依然是‘a’。
我们知道没有必要再将‘b’与‘a’比对了,因为回溯后的字符和原字符是相同的,原字符不匹配,回溯后的字符自然不可能匹配。但是KMP算法中依然会将‘b’与回溯到的‘a’进行比对。这就是我们可以改进的地方了。我们改进后的next数组命名为:nextval数组。
KMP算法的改进可以简述为:
如果a位字符与它next值指向的b位字符相等,则该a位的nextval就指向b位的nextval值,如果不等,则该a位的nextval值就是它自己a位的next值。
void GetNextval(SqString t,int nextval[])
//由模式串t求出nextval值
{int j=0,k=-1;nextval[0]=-1;while (j<t.length) {if (k==-1 || t.data[j]==t.data[k]) { j++;k++;if (t.data[j]!=t.data[k]) nextval[j]=k;else nextval[j]=nextval[k];}else k=nextval[k]; }
}相关文章:
KMP算法【数据结构】
KMP算法 KMP算法是一种改进的字符串匹配算法 Next[j] k :一个用来存放子串返回位置的数组,回溯的位置用字母k来表示。其实就是从匹配失败位置,找到他前面的字符串的最大前后相等子串长度。默认第一个k值为-1(Next[0] -1),第二个k值为0(Next[1] 0),我…...
测开笔记--Typescript: 文件复制到指定目录
开发背景: 自动化开发语言使用的是TypeScript;框架用的是playwright。有个测试脚本需要先将几个文件复制粘贴到新建的项目文件夹下,系统会读取该文件,然后生成页面信息。 关键字:文件复制粘贴; 新建的项目…...
数字滚动vue-count-to
数字滚动 下载插件 npm i vue-count-to 使用 start-val 起始值,表示从什么值开始滚 end-val 终点值,表示要滚到多大值 duration 滚动事件,表示用多长时间来滚动 <countTo :start-val"0" :end-val"228" :duration&quo…...
扩散模型实战(十一):剖析Stable Diffusion Pipeline各个组件
推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 扩散模型实战(四ÿ…...
Mysql面试题总结
数据库三大范式是什么 第一范式:每个列都不可以再拆分。 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。 第三范式:在第二范式的基础上,非主键列只依赖于主键&#…...
学习知识随笔(Django)
文章目录 MVC与MTV模型MVCMTV Django目录结构Django请求生命周期流程图路由控制路由是什么路由匹配反向解析路由分发 视图层视图函数语法reqeust对象属性reqeust对象方法 MVC与MTV模型 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M&#…...
基于element自动表格
需求是根据JSON文件生成表格,包含配置和自动props属性以及过滤器; 数据示例: 表格设置: /*** 表格表头信息* chineseToPinYin: 这是封装的根据中文汉字转换为拼音的方法* prop: 表头字段名* filter: 数据过滤器* label: 表头显示…...
Python基础语法之学习数据转换
Python基础语法之学习数据转换 一、代码二、效果 一、代码 #数字转换成字符串 num_str str(11) print(type(num_str))#字符串转整数 numint("11") print(type(num),num)#浮点数转整数 float_num int(11.1) print(type(float_num),float_num)#整数转浮点数 num_flo…...
最新AI创作系统ChatGPT网站运营源码、支持GPT-4-Turbo模型,图片对话识图理解,支持DALL-E3文生图
一、AI创作系统 SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧!本系统使用NestjsVueTypescript框架技术,持续集成AI能力到本系统。支持OpenAI DALL-E3文生图,…...
Kotlin中常见的List使用
文章目录 1.filter2.map3.count4.first,last5.any,all,none6.find,findLast7.indexOf()和lastIndexOf()查找元素下标8.Slice切片9.Take()和drop()获取指定长度 1.filter filter 就像其本意一样,可以通过 filter 对 Kotlin list 进行过滤。 fun main() …...
汽车电子 -- 车载ADAS之LCA(变道辅助系统)
相关法规文件: LCA: ISO 17387-2008 Intelligent transport systems — Lane change decision aid systems 一、变道辅助系统 LCA (Lane Change Assist) LCA 系统(变道辅助系统)监测后方相邻车道区域,如果有车辆在后…...
MongoDB——golang操作(链接,CURD,聚合)
MongoDB golang操作 中文文档 链接 package mainimport ("context""fmt""log""go.mongodb.org/mongo-driver/mongo""go.mongodb.org/mongo-driver/mongo/options" )func main() {// 设置客户端连接配置clientOptions : o…...
音视频项目—基于FFmpeg和SDL的音视频播放器解析(十八)
介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…...
绿色能源守护者:光伏运维无人机
随着我国太阳能光伏产业被纳入战略性新兴产业,光伏发电成为实现“双碳”目标的关键之一。在政策支持下,光伏产业维持高速发展,为迎接“碳达峰、碳中和”大势注入了强大动力。在这一背景下,复亚智能与安徽一家光伏企业合作…...
i已学赋能智慧教育时代的幼儿教育
伴随“教育数字化战略行动”的深入开展,智慧教育正式成为国家战略。智慧教育延伸至家校社教育的每个阶段。当前,为适应智慧教育发展趋势,我国制定了《中国教育现代化2035》《教育部关于加强“三个课堂”应用的指导意见》《教育信息化2.0行动计划》等文件。幼儿作为智慧教育、智…...
[栈迁移+ret滑梯]gyctf_2020_borrowstack
题目来源buuctf——gyctf_2020_borrowstack 参考链接https://www.shawroot.cc/2097.html 题目信息ubuntu16、64位 第一个read仅溢出一个机器字长,需要栈迁移 解题步骤栈偏移到全局变量bank中,ret2libcgadget 关键步骤 ret滑梯 第二个payload需要添…...
PTA:用函数实现从数列中删除一个数
题目: 编写一个函数实现:删除n个元素的数列中下标为k的元素。 测试程序将输入一个下标值,调用本函数,删除数列{1,4,13,9,6,11,18,14,25}中该下标位置的元素,并输出删除后的数列。 函数接口定义: void de…...
C++设计模式之工厂模式(中)——工厂模式
工厂模式 工厂模式介绍示例示例使用运行结果工厂模式与简单工厂模式区别 工厂模式 工厂模式在简单工厂模式的基础之上进行了改进。当需要生产的产品种类增加,可以通过新增子类工厂来生产,没有破坏程序设计原则中的开放封闭原则。 介绍 工厂模式先抽象…...
关于el-table的二次封装及使用,支持自定义列内容
关于el-table的二次封装及使用 table组件 <template><el-table ref"tableComRef" :data"tableData" border style"width: 100%"><el-table-column v-if"tableHeaderList[0]?.type selection" type"selection&…...
【Vue】Vue3 配置全局 scss 变量
variables.scss $color: #0c8ce9;vite.config.ts // 全局css变量css: {preprocessorOptions: {scss: {additionalData: import "/styles/variables.scss";,},},},.vue 文件使用...
GreaterWMS:基于福特亚太售后物流实战经验的开源仓储管理系统架构解析
GreaterWMS:基于福特亚太售后物流实战经验的开源仓储管理系统架构解析 【免费下载链接】GreaterWMS This Inventory management system is the currently Ford Asia Pacific after-sales logistics warehousing supply chain process . After I leave Ford , I star…...
Arduino nRF5x低功耗库:深度解析SYSTEM_OFF与CONSTANT_LATENCY模式
1. 项目概述 Arduino nRF5x_lowPower 是专为 Nordic Semiconductor nRF5x 系列 SoC(如 nRF52832、nRF52840、nRF51822)设计的 Arduino 兼容低功耗管理库。它并非简单封装睡眠函数,而是深度对接 nRF5x 片上电源管理单元(PMU&…...
【CANNBot学习周】4.13~4.16入门课程来袭
经历了上一期“CANNBot发布:畅享算子开发新体验”,相信你对解锁智能化昇腾CANN算子开发已经跃跃欲试。 CANNBot学习周入门课程来袭,包含4门从易到难的实操课程,带你从 0 到 1 掌握核心技能!课程覆盖Ascend C、PyPTO和…...
3种实用方法:使用MediaCreationTool.bat绕过Windows 11硬件限制完全指南
3种实用方法:使用MediaCreationTool.bat绕过Windows 11硬件限制完全指南 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationT…...
一维最佳快递站问题(暴力 + DP 两种解法,专业版)
一、题目描述(CSP-J 入门难度)一条笔直公路上分布 n 个村庄,各村庄按坐标 1、2、…、n 依次排列,相邻村庄间距为 1。每个村庄有固定人口(权值),需在某一村庄建立快递站,使得所有村庄…...
M5Unit-8Encoder驱动库:工业级8路编码器I²C嵌入式实践
1. M5Unit-8Encoder 库深度解析:面向嵌入式工程师的工业级旋转编码器驱动实践指南1.1 项目定位与工程价值M5Unit-8Encoder 是专为 M5Stack 生态中 UNIT-8Encoder 模块设计的嵌入式驱动库,其核心价值在于将一款具备 8 路独立增量式编码器接口、支持高速计…...
Verilog新手避坑指南:用Icarus Verilog写Testbench时,$dumpfile和$dumpvars这两行到底有什么用?
Verilog仿真核心机制解析:$dumpfile与$dumpvars的底层逻辑与实战技巧 刚接触Verilog仿真的开发者,往往会在Testbench中看到这两行神秘的代码: $dumpfile("waveform.vcd"); $dumpvars(0, top_module);它们像黑魔法咒语一样被复制粘贴…...
MySQL优化全攻略:索引、SQL与分库分表的最佳实践嘶
一、各自优势和对比 这是检索出来的数据,据说是根据第三方评测与企业数据,三款产品在代码生成质量上各有侧重: 产品 语言优势 场景亮点 核心差异 百度 Comate C核心代码质量第一;Python首生成率达92.3% SQL生成准确率提升35%&…...
stock-sdk-mcp 的实践整理贡
一、什么是urllib3? urllib3 是一个用于处理 HTTP 请求和连接池的强大、用户友好的 Python 库。 它可以帮助你: 发送各种 HTTP 请求(GET, POST, PUT, DELETE等)。 管理连接池,提高网络请求效率。 处理重试和重定向。 支…...
让离线 Debian 系统重获新生:apt-offline 实战指南
让离线 Debian 系统重获新生:apt-offline 实战指南 【免费下载链接】apt-offline Offline APT Package Manager 项目地址: https://gitcode.com/gh_mirrors/ap/apt-offline 在互联网连接不稳定或完全断开的场景中,Debian 系统的包管理能力往往会大…...
