LeetCode KMP 算法
可以参考
https://www.bilibili.com/video/BV1AY4y157yL/
kmp 主要做的就是子串匹配,类似C程序的 strstr() 函数
记录一下,也防止我自己忘记
传统暴力求解算法是
源串 ssssssssa
子串 sssa(下面暴力求解)
先 (子串从 0 位置匹配,并且匹配到最后一个字符才发现不对,白搞)
ssssssssasssa其次 (子串从 0 位置匹配,并且匹配到最后一个字符才发现不对,白搞)
ssssssssasssa再后面就是 (子串从 0 位置匹配,并且匹配到最后一个字符才发现不对,白搞)
ssssssssasssa效率不高
kmp的算法出现,就是为了解决这个问题
kmp是由三位大佬发现的,他们三人的名字首字母分别就是K、M、P
有没有一种办法就是少做无用功,在刚刚那个场景下
先 (a和c不匹配)
ssssssssa
sssa其次,(子串从 2 位置匹配)
ssssssssasssa然后,(子串从 2 位置匹配)
ssssssssasssa.......最后
然后,(子串从 2 位置匹配),匹配成功
ssssssssasssa从 2 位置匹配,显然提高了匹配速度
但是 2 位置是怎么知道的呢,kmp 算法中就是先计算一个数组叫做 next,这个next计算只需要子串,然后next的作用是记录子串回溯的位置,当源串和子串不匹配时,不像上面那样老是回溯0
子串 sssa
next数组 0120回溯的位置就是最长前缀的位置
比如
子串 abcabcd
next数组 ...1230
解释
1 是因为 a=a
2 是因为前面已经有匹配字符 a=a 了,那么 现在刚好 b=b,就最长前缀就等于 1 的基础上加 1 等于 2
3 是因为前面已经有匹配字符 a=a b=b 了,那么 现在刚好 c=c,就最长前缀就等于 2 的基础上加 1 等于 3
0 是因为d没有最长前缀为啥next是基于前缀,因为比如我都匹配到最后一位d和a(源串第七个)不相等了,由于前面有相似的前缀
源串 abcabcaeee
子串 abcabcd那么下一步就是 【子串a(第四个)和a(源串第七个,第七个刚刚没匹配上)比,就是因为前缀一样,才敢让子串匹配位置不从0开始,因为前面有相似的结构】
源串 abcabcaeee
子串 abcabcd特殊场景
子串 sssa
next数组 0120
解释
0 是因为s没有最长前缀
1 是因为 第二个s=第一个s
2 是因为前面已经有匹配字符 s=s 了,那么 现在刚好 第三个s=第二个s,就最长前缀就等于 1 的基础上加 1 等于 2
下面需要结合底部计算next函数一起看
子串 sssa
next数组 0120(其实就是在计算前缀)
计算next数组也是有两个下标计算,建议对照下面代码看 (i为遍历字符串的变量,j为最长前缀的下标)
首先 next[0] 肯定是等于0的,第一个就不匹配,那肯定回溯还是0,
那么 next[1] 由于 str[i] == str[j] 即 str[0] == str[1],s==s,前缀相同,j自然++
next[1]=j,即 next[1]=1
由于本题是 sssa
所以会出现子串 sssa
next数组 012?(题外话,我们知道a是在前面没有最长前缀的,最后结果肯定为0)
匹配到最后一位时,我们发现跟前面不相等,j就看看前面有没有相等的,j=2,但是 str[2] 也不等于 a
然后while循环一直往前找最长前缀(从2到1到0),最终没找到,为0但是,比如子串 aaaab....aaaaa
next数组 01230....0123?(此时j为3,i为n)?处 a和b不匹配,j=next[j-1],即 j=next[3-1],即 j=2,而str[2]==str[n],j++,退出
next[n]=3,这里j没有从0开始,快了一点,其实从0开始也能算出3这个结果最终结果为
子串 aaaab....aaaaa
next数组 01230....01233上代码
class Solution {
public:int strStr(string haystack, string needle) {// 计算nextvector<int> next(needle.length(), 0);getNext(needle, next);// 匹配过程int j=0;int i=0;for(;i<haystack.length() && j<needle.length();) {// 当前串匹配if (haystack[i]==needle[j]) {j++;i++;} else {// 当前串不匹配if (j==0)// 防止j一直卡在0,死循环i++;else// 当前串不匹配,但是i的值不自增,只改变j j=next[j-1];}}// 返回结果if (j==needle.length())return i-j;elsereturn -1;}void getNext(string &str,vector<int> &next) {// j 从 0 开始, i 从 1 开始,已知第一个 next[0] 一定是等于 0 的,因为前面没有字符了for(int j=0,i=1;i<str.length();i++) {// 当前如果不匹配,那就去看看它前一个的下标位置对应的字符是否匹配while (j > 0 && str[i] != str[j]) {j=next[j-1];}// 当前如果匹配,j 往前走if(str[i]==str[j]) {j++;}// j 走多远,前缀最长就是多远next[i] = j;}}
};
相关文章:
LeetCode KMP 算法
可以参考https://www.bilibili.com/video/BV1AY4y157yL/kmp 主要做的就是子串匹配,类似C程序的 strstr() 函数记录一下,也防止我自己忘记传统暴力求解算法是源串 ssssssssa 子串 sssa(下面暴力求解) 先 (子串从 0 位置匹配&#x…...
全面剖析OpenAI发布的GPT-4比其他GPT模型强在哪里
最强的文本生成模型GPT-4一、什么是GPT-4二、GPT-4的能力三、和其他GPT模型比较3.1、增加了图像模态的输入3.2、可操纵性更强3.3、复杂任务处理能力大幅提升3.4、幻觉、安全等局限性的改善3.6、风险和缓解措施改善更多安全特性3.7、可预测的扩展四、与之前 GPT 系列模型比较五、…...
leetcode——26. 删除有序数组中的重复项
文章目录🐨1. 题目🏹2. 思路🪃3. 代码实现🐨1. 题目 给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。 由…...
基于springboot垃圾分类网站设计实现【毕业论文、源码】
摘要本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述垃圾分类网站的当前背景以及系统开发的目的&#x…...
计算机组成原理实验一(完整)
在VC中使用调试功能将下列语句运行的内存存放结果截图,每运行一句需截图一次。 #include<stdio.h> int main() {int a 你的学号末两位-100; //0x????????&#x…...
【SSM】MyBatis(一.基础)
文章目录1.ORM2. 数据库表3. 入门程序3.1 创建项目3.2 开发3.3 一个比较完整规格的mybatis程序3.4 测试案例 junit3.5 对第一个mybatis使用junit测试3.6 集成日志框架logback3.7mybatis工具类编写1.ORM Object(JVM中的Java对象) Relational(关系型数据库) Mapping(映射) mybat…...
LInux指令之文件目录类
文章目录一、帮助指令二、文件目录类ls指令cd指令 (切换目录)mkdir指令(创建目录)rmdir指令(删除目录)touch指令(创建空文件)cp指令(拷贝文件)rm指令mv指令cat指令(查看)more指令les…...
【c++】:STL中vector的模拟使用及模拟实现
文章目录 前言一.使用库中vector常用接口二.vector的模拟实现总结前言 上一篇我们讲解了STL中的string的使用和模拟实现,这次我们就来讲解STL中的vector,vector相对于string来说模拟实现会难一些,难点在于迭代器失效问题和深浅拷贝问题。 首…...
C++ STL:vector的使用方法及模拟实现
目录 一. vector概述 二. vector接口函数的使用方法和模拟实现 2.1 vector类模板的成员变量 2.2 构造函数的使用和模拟实现 2.2.1 构造函数的使用方法 2.2.2 构造函数的模拟实现 2.3 析构函数的模拟实现 2.4 赋值运算符重载函数的使用和模拟实现 2.4.1 函数的使用 2.…...
naive UI 的upload组件自定义手动上传图片的base64位
<template><n-upload ref"uploadRef" action"#" :default-upload"false" :custom-request"myUpload"><n-button>点击选择文件</n-button></n-upload><n-button click"submitUpload"> 上…...
信创办公–基于WPS的PPT最佳实践系列(表格和图标常用动画)
信创办公–基于WPS的PPT最佳实践系列(表格和图标常用动画) 目录应用背景操作步骤图表常用动画效果:擦除效果表格常用动画效果:轮子效果应用背景 文不如表,表不如图。在平时用ppt做总结时,我们会经常用到图…...
Spring Bean实例化和初始化的过程
承接上文Spring Bean生命周期应用程序在运行过程中能否去读取当前系统的环境变量或系统属性?这里涉及到一个非常重要的接口Environment,System.getenv,System.getProperties都是获取当前系统环境变量,Environment接口的实现类AbstractEnviro…...
WorkTool企微机器人接入智能问答
一、前言 最新版的企微机器人已经集成 Chat ,无需开发可快速搭建智能对话机器人。 从官方介绍看目前集成版本使用模型为 3.5-turbo。 二、入门 创建 WorkTool 机器人 你可以通过这篇快速入门教程,来快速配置一个自己的企微机器人。 实现的流程如图&…...
C导入正则库问题
环境 操作系统:win11 专业版 gcc: gcc (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0 编辑器:vscode 要求 在c中使用正则表达式 遇到的问题以及解决思路 C标准中并没有正则表达式库 从其他地方下载正则表达式库即可。 http://gnuwin32.sourcefo…...
尚融宝05-Node.js入门
目录 一、Node.js的概念 1、JavaScript引擎 2、什么是Node.js 二、下载和安装 1、下载和安装 2、查看安装是否成功 三、初始Node.js程序 1、运行一个程序 常见问题 2、文件的读取 3、服务器端程序 三、Node.js的作用 1、Node.js的应用场景 2、BFF 解决什么问题 …...
「SAP ABAP」OPEN SQL(八)【WHERE语句大全】
💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…...
Ribbon负载均衡的原理(源码分析)
SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。1)LoadBalancerIntercepor可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:1.request.getURI():获取请…...
用sql计算两个经纬度坐标距离(米数互转)
目录 一、sql示例(由近到远) 二 、参数讲解 三、查询效果 - 距离(公里 / 千米) 四、查询效果 - 距离(米) 五、距离四舍五入保留后2位小数(java) 一、sql示例(由近到远…...
C语言详解KMP算法
如果给你一个字符串 和 该字符串的一个子字符串 你能否快速找出该子字符串的所在位置我猜 这里会有一群杠精 说可以找到 真的吗 那下面这个字符串你可以一眼看出来吗你能找出来吗 如果能 算你眼神好 如果不能 那就看看接下来我怎么做你有想到暴力求解法吗?——来自百…...
redis在window上安装与自启动
需求: 客户window服务器使用redis,需要配置成在window服务中,并且可以随着电脑自启动服务。 下载 https://github.com/tporadowski/redis/releases打开上面的下载地址,这里我们下载zip压缩版本。 解压到待安装目录下ÿ…...
LongCat-Video:136亿参数开源AI视频生成模型的技术突破与实践指南
LongCat-Video:136亿参数开源AI视频生成模型的技术突破与实践指南 【免费下载链接】LongCat-Video 项目地址: https://ai.gitcode.com/hf_mirrors/meituan-longcat/LongCat-Video 在人工智能视频生成领域,长视频生成一直是技术挑战的制高点。传统…...
UE4实战:利用VaRest与VictoryBPLibrary实现高效本地文件读写
1. 为什么需要本地文件读写 在虚幻引擎4开发过程中,我们经常需要保存游戏配置、玩家进度或者关卡数据。想象一下你正在开发一个RPG游戏,需要记录玩家背包里的所有物品、当前任务进度和角色属性。如果每次退出游戏这些数据都消失,玩家肯定会抓…...
解锁欧空局10米土地利用数据:从注册到实战应用全流程解析
1. 欧空局10米土地利用数据简介 第一次接触欧空局WorldCover平台的朋友可能会被这个10米分辨率的土地利用数据惊艳到。作为一个长期和遥感数据打交道的从业者,我可以很负责任地说,这个数据集在精度和实用性上确实很能打。简单来说,它把全球地…...
实战应用:基于快马平台开发排序算法性能对比分析工具
今天想和大家分享一个特别实用的工具开发经历——用InsCode(快马)平台快速搭建了一个排序算法性能对比分析工具。这个项目不仅帮我巩固了算法知识,还意外发现了很多实际应用中的细节问题,特别适合用来理解不同排序算法的实战表现。 1. 为什么需要这个工…...
电容耦合等离子刻蚀(CCP)在先进芯片制造中的关键作用与工艺优化
1. 电容耦合等离子刻蚀(CCP)技术解析 第一次接触CCP刻蚀设备时,我被它那看似简单却暗藏玄机的结构震撼到了——两块金属电极板,加上射频电源,就能实现纳米级的精密加工。这种利用电容耦合原理产生等离子体的技术&#…...
CD3抗体如何成为双抗药物的核心靶点?
一、双特异性抗体药物为何发展迅猛?双特异性抗体(BsAb)是一类能够同时特异性结合两个不同抗原或抗原表位的人工工程抗体。其通过同时阻断两个靶点介导的生物学功能,或将表达不同抗原的细胞拉近,实现单一抗体难以完成的…...
重新定义交通安全研究范式:基于无人机轨迹数据的数字孪生解决方案
重新定义交通安全研究范式:基于无人机轨迹数据的数字孪生解决方案 【免费下载链接】UCF-SST-CitySim1-Dataset 项目地址: https://gitcode.com/gh_mirrors/ucf/UCF-SST-CitySim-Dataset 在自动驾驶技术快速发展的今天,传统交通安全研究面临着一个…...
新手入门指南:在快马平台用AI生成代码理解云桌面基础概念
今天想和大家分享一个特别适合新手理解云桌面基础概念的实践方法。作为一个刚接触云计算的小白,我最初对"一台主机创建多个云桌面"这个概念也是一头雾水,直到在InsCode(快马)平台上尝试用AI生成代码来模拟这个过程,才真正搞明白其中…...
StructBERT中文语义匹配实战:一键部署+可视化进度条,小白也能用
StructBERT中文语义匹配实战:一键部署可视化进度条,小白也能用 1. 工具概览:你的中文句子"CT扫描仪" 想象一下,你手上有两份用户反馈:"这个手机电池很耐用"和"这款设备续航能力超强"。…...
基于Python的校园便利平台毕设源码
博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于Python的校园便利平台,以提升校园生活品质,优化资源配置,增强学生与教职工的互动体验。具体研究目的如…...
