KMP算法笔记-力扣28.找出字符串中第一个匹配项的下标

KMP算法:

1、文本串、模式串:要在文本串:

aabaabaafa 中查找是否出现过一个模式串:aabaaf。

2、前缀表:

记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。能告诉我们 上次匹配的位置,并跳过去。

3、最长相等前后缀:

前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串。

后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。

对于模式串 aabaaf,相同前后缀长度为:

a 0
aa 1
aab 0
aaba 1
aabaa 2
aabaaf 0
 a a b a a b a a f a   文本串0 1 2 3 4 5           模式串a a b a a f0 1 0 1 2 0

下标5之前这部分的字符串(也就是字符串aabaa)的最长相等的 前缀 和 后缀字符串是 子字符串aa ,因为找到了最长相等的前缀和后缀,匹配失败的位置是 后缀子串 的后面(f),那么我们找到与后缀aa相同的前缀aa的 后面(b)重新匹配就可以了。

4、next数组:

就是前缀表,也可以是前缀表统一减一(右移一位,初始位置为-1)。

核心:遇见冲突(f)就回退!

假设 i 是后缀末尾,j 是前缀末尾:
前后缀不相等就回退,前后缀相等就更新next数组的值,最终得出next数组。

文本串:a a b a a b a a f a
模式串:0 1 2 3 4 5
a a b a a f
0 1 0 1 2 0 最长相等前后缀: 取最长相等前后缀的值作为索引 2
-1 0 1 0 1 2 右移一位: 取冲突位置的索引 2
-1 0 -1 0 1 -1 都-1: 取最长相等前后缀的值+1 作为索引 2

28.找出字符串中第一个匹配项的下标的C++代码:

class Solution {
public:void getNext(vector<int>& next, const string &s){ //vector<int>& next 引用方式相当于起别名//1、初始化int j = 0;next[0] = j;// i后缀末尾,j前缀末尾for (int i = 1; i < s.size(); i++){//2、前后缀不相等while (j > 0 && s[i] != s[j]){j = next[j-1];}//3、前后缀相等if (s[i] == s[j]){j++; //前后缀相等了要++}next[i] = j; //j就是相等前后缀的长度}}int strStr(string haystack, string needle) {if (needle.size() == 0){return -1;}vector<int> next(needle.size()); //next数组和needle字符串一样大getNext(next, needle); //传入next首元素的地址 和 needle字符串,计算needle字符串的前缀表cout << next[0] << endl;int j = 0;for (int i = 0; i < haystack.size(); i++){while (j > 0 && haystack[i] != needle[j]){j = next[j-1]; //j>0 防止数组越界}if (haystack[i] == needle[j]){j++;}if (j == needle.size()){return (i-needle.size()+1);}}return -1;}
};

补充知识:关于 getNext(&next[0], needle);
在 C++ 中,传递数组给函数时,可以直接传递数组名或者数组的指针。这是因为数组名本身就是数组的地址,而数组在内存中是连续存储的,因此可以通过数组名或数组的指针来访问数组的元素。

例如,对于一个数组 int a[],你可以直接将 a 作为参数传递给函数,因为 a 本身就是数组的地址。在函数内部,可以通过该地址访问数组的元素。

但是对于 vector 这样的容器类,情况略有不同。vector 是一个类模板,它封装了动态分配的连续内存块,而不像数组那样是静态分配的。因此,传递 vector 对象时,一般需要使用其指针或引用来访问。

因此,如果函数形参是vector & next,那么实参就直接传next(相当于引用别名的方式传参);
如果函数形参是int* next,那么实参就是&next[0],把首元素地址传过去,然后用一个in类型的指针指向它。个人建议用引用方式,更容易理解也安全。

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

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

相关文章

PyQt5设计师QtDesigner控件箱控件介绍及讲解

QtDesigner Qt Designer 是一个由Qt官方提供的图形用户界面设计工具&#xff0c;旨在帮助开发者快速、方便地设计和布局Qt应用程序的用户界面。Qt Designer提供了一个直观的可视化界面&#xff0c;开发者可以通过拖放、设置属性等方式设计界面&#xff0c;而无需编写繁琐的布局…

007 springboot整合mybatis-plus 增删改查 ModelAndView jsp 分页

文章目录 MybatisplusConfig.javaReceiveAddressController.javaReceiveAddress.javaReceiveAddressMapper.javaReceiveAddressServiceImpl.javaIReceiveAddressService.javaServerResult.javaServletInitializer.javaSpringbootDemoApplication.javareceive_address.sqlReceiv…

c# LiteDB的基础用法

LiteDB 是一个轻量级的嵌入式 NoSQL 数据库&#xff0c;其设计理念与 MongoDB 类似&#xff0c;但它是完全使用 C# 开发的&#xff0c;因此与 C# 应用程序的集成非常顺畅。与 SQLite 相比&#xff0c;LiteDB 提供了 NoSQL&#xff08;即键值对&#xff09;的数据存储方式&#…

【canvas】canvas基础使用(九):文本绘制

简言 canvas除了能够绘制图形外&#xff0c;也可以绘制文本。 绘制文本 fillText() 填充文本 CanvasRenderingContext2D 对象的方法 fillText() 是 Canvas 2D API 的一部分&#xff0c;它在指定的坐标上绘制文本字符串&#xff0c;并使用当前的 fillStyle 对其进行填充。存…

论文解读:FREE LUNCH FOR FEW-SHOT LEARNING: DISTRIBUTION CALIBRATION

文章汇总 问题 学习到的模型很容易因为只有少数训练样本形成的有偏分布而变得过拟合。 动机 我们假设特征表示中的每个维度都遵循高斯分布&#xff0c;因此分布的均值和方差可以借鉴类似类的均值和方差&#xff0c;这些类的统计量可以通过足够数量的样本得到更好的估计。 …

11.盛最多水的容器(Java,双指针)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同…

Vue - 5( 16000 字 Vue2 入门级教程)

一&#xff1a;Vue 初阶 1.1 组件自定义事件 在 Vue 中&#xff0c;组件间通过自定义事件进行通信是一种常见的模式。自定义事件允许子组件向父组件发送消息&#xff0c;也可以在组件内部进行事件的绑定、触发和解绑。让我们详细讲解这些知识点。 1.1.1 组件自定义事件 在 …

季节更迭 关爱不变 | 鲁南制药四季守护您的健康生活

春天&#xff0c;万物复苏的季节&#xff0c;一切都充满了生机和活力。在春日的阳光下&#xff0c;鲜花盛开&#xff0c;绿叶茂盛&#xff0c;鸟儿欢歌&#xff0c;蝴蝶翩翩起舞。我们的身体也需要特别的关爱和养护&#xff0c;保持健康和活力&#xff0c;更好地迎接每一次季节…

2924. 找到冠军 II --力扣 --JAVA

题目 一场比赛中共有 n 支队伍&#xff0c;按从 0 到 n - 1 编号。每支队伍也是 有向无环图&#xff08;DAG&#xff09; 上的一个节点。 给你一个整数 n 和一个下标从 0 开始、长度为 m 的二维整数数组 edges 表示这个有向无环图&#xff0c;其中 edges[i] [ui, vi] 表示图中…

知识跟踪模型GraphKT

1 知识跟踪Knowledge Tracing的概念 知识跟踪可以用来解决自适应学习问题。如何通过与教学材料的在线互动来有效地跟踪学生的学习进展&#xff1f;知识跟踪可用于量化学生的知识状态&#xff0c;即对教材所涉及的技能掌握水平。用于评估和模拟学生随着时间推移对技能的认知掌握…

前端CSS讲义1

什么是 CSS? CSS 指层叠样式表 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中&#xff0c;是为了解决内容与表现分离的问题 外部样式表可以极大提高工作效率 外部样式表通常存储在 CSS 文件中 多个样式定义可层叠为一 样式对网页中元素…

AI数字人对话之RealChar框架源码解读

零.功能介绍 与虚拟角色(非形象)进行文本或语音会话 体验地址:RealChar. 代码库:GitHub - Shaunwei/RealChar: 🎙️🤖Create, Customize and Talk to your AI Character/Companion in Realtime (All in One Codebase!). Have a natural seamless conversation with AI…

Java基础知识总结(55)

&#xff08;2&#xff09; ArrayList和LinkedList的区别 1、ArrayList和LinkedList都实现了List接口2、ArrayList和LinkedList都是非线程安全的&#xff0c;因此在多线程环境下可能会出现出现不同步的情况3、ArrayList底层实现是数组&#xff0c;LinkedList底层实现是双向链表…

姿态估计-人脸识别mesh-3d手势识别-3d目标检测-背景分割-人脸关键点

往期热门博客项目回顾&#xff1a;点击前往 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上…

字节8年经验之谈 —— 聊一聊自动化测试为什么很难落地!

聊一聊自动化测试为什么很难落地 在软件开发和质量保障的领域&#xff0c;测试是确保软件质量的关键环节。自动化测试是一种利用脚本和工具自动执行测试用例的方法&#xff0c;可以提高测试效率、减少人工错误&#xff0c;并支持持续集成和交付。自动化测试作为提高测试效率和…

企业图纸管理软件,企业图纸管理软件有哪些推荐?

企业图纸管理软件是一种专门用于组织、存储、管理和共享企业图纸及相关文档的工具。这类软件可以帮助企业实现图纸的集中化、规范化管理&#xff0c;提高工作效率&#xff0c;降低管理成本。 企业图纸管理软件的核心功能通常包括以下几个方面&#xff1a; 集中化管理&#xff1…

视频识别实现智能公共安防监控

在公共安防领域&#xff0c;以视频监控、楼宇对讲、防盗报警、出入口控制应用最为广泛。其中&#xff0c;视频监控是公共安防领域的核心。通过智能视频识别技术&#xff0c;可以实现自动化的人物身份识别、人物行为分析、人脸识别、车辆识别、突发事件识别等功能。 在公共安防…

bestvike --bvframe学习

ref title fetch后台api 分页属性&#xff0c;pagination 要差几条&#xff1f;pagelimit 在api中写一个饭方法&#xff0c;vue中用用他 vue.cinfig.js中配置别名 nacos微服务 实体类要继承basedata&#xff08;封装了公共数据&#xff09; 控制器autowired&#xff0c;getm…

亚信安慧AntDB:实时数据洞察的利器

AntDB数据库以其独特的创新能力在分布式数据库领域引领潮流。其中&#xff0c;融合统一与实时处理是其两大核心创新能力&#xff0c;为其赢得广泛关注与赞誉。融合统一意味着AntDB能够将多种不同类型的数据库融合为一体&#xff0c;实现数据的统一管理与处理&#xff0c;极大地…

2024年第十五届蓝桥杯研究生组题目总结(Java、Python、C++)

2024年十五届蓝桥杯研究生组 今年的题较去年难度降低了很多&#xff0c;题量也少了2道。 Q1 劲舞团 读文件&#xff0c;找到最长的满足条件的子数组的长度 答案是&#xff1a;9 BufferedReader&#xff0c;fopen&#xff0c;open Q2 召唤数学精灵 找规律&#xff0c;周期…