28. 找出字符串中第一个匹配项的下标【 力扣(LeetCode) 】
一、题目描述
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
二、测试用例
示例 1:
输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。
示例 2:
输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。
提示:
1 <= haystack.length, needle.length <= 104
haystack 和 needle 仅由小写英文字符组成
三、解题思路
- 基本思路:
采用KMP算法; - 具体思路:
- 计算 next 数组:可以暴力计算,也可以优化方法;这里介绍优化方法:
- ①
next[0]和next[1]必定为 0 ,从next[2]开始计算。next[i] 表示前 i 个字母相同,第 i+1 个字母不同时,应该跳转的位置。 例如:
以 i=4 为例,表示前 4 个字母相同,但第 5 个字母不同,正常情况下,匹配字符串 ABCABD 匹配到第 5 个字母 B 时遇到不匹配字母时,则要从头即 A 开始重新匹配,但是其实我们已经匹配过前 4 个字母,我们知道前 4 个字母的情况,即待匹配序列为 …ABCA#**** 的形式,我们可以不需要返回从 A 开始,可以直接从 # 位置开始与匹配字符串的第二个字母 B 进行匹配,即 next 可以不用等于 0 ,可以等于 1 。【第一个字母下标 0,第二个字母下标为 1】 - ② 定义变量 p ,表示相同前缀下标,初始化为 0 ;定义变量 i ,用于遍历 next 数组,初始化为 2 ;
- ③ 判断
needle[i-1]和needle[p]是否相等,相等表示他们有相同的前缀,则将p+1的值赋值给next[i];否则,表示他们前缀不同,则判断 p 是否等于 0 ,等于 0 表示不存在相同的前缀,则 next = 0 ,不等于 0 表示可能存在相同前缀,令 p = next[p] ,继续寻找相同前缀;
- ①
- 进行匹配:
- ① 定义变量 i 和 j ,用于遍历待匹配字符串和匹配字符串,初始化都为 0 ;
- ② 遍历字符串,如果两个字母相同,则匹配下一个字母,如果匹配字符串都匹配完,则返回下标;如果字母不同,则判断是否为匹配字符串的第一个字母,是则表示第一个字母都不一样,则待匹配字符串下移一个字母,不是则表示可能存在匹配前缀,匹配字符串根据 next 数组移动要对应位置。遍历结束则表示不存在匹配的字符串,则返回 -1 。
- 计算 next 数组:可以暴力计算,也可以优化方法;这里介绍优化方法:
四、参考代码
时间复杂度: O ( n + m ) \Omicron(n+m) O(n+m) 【 m 为待匹配字符串长度,n 为匹配字符串长度】
空间复杂度: O ( n ) \Omicron(n) O(n)
class Solution {
public:void setNext(vector<int> &next,string needle){int n=next.size();int p=0;next[0]=next[1]=0;for(int i=2;i<n;){if(needle[i-1]==needle[p]){next[i++]=++p;}else{if(p==0){next[i++]=0;}else{p=next[p];}}}}int strStr(string haystack, string needle) {int n=needle.size();int m=haystack.size();int j=0;vector<int> next(n+1,0);setNext(next,needle);for(int i=0;i<m;){if(haystack[i]==needle[j]){j++;i++;if(j==n){return i-j;}}else{if(j==0)i++;j=next[j];}}return -1;}
};
相关文章:
28. 找出字符串中第一个匹配项的下标【 力扣(LeetCode) 】
一、题目描述 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 二、测试用例 示例 1: 输…...
邀请函 I 松下信息和望繁信科技邀您参加「数智时代下大数据应用的“道”与“术”」闭门会议
在数字化浪潮席卷全球的今天,大数据与智能化的结合成为企业成功的关键。为了深入探讨这一重要议题,松下信息系统(上海)有限公司(简称“松下信息”)与上海望繁信科技有限公司(简称“望繁信科技”…...
Node.js中的fs.watchFile与fs.unwatchFile:文件监控与取消监控
在Node.js中,对文件系统的操作是非常常见的需求。有时,我们需要对某个文件的变化进行实时监控,并在文件内容或元数据发生变化时执行相应的操作。Node.js的fs模块提供了watchFile和unwatchFile两个方法,用于实现文件的监控和取消监…...
Hadoop大集群配置文档-粗略版-3万字长文 (包括hive,zookeeper,hbase,flume等中间件和mysql等)
先填一下上次许诺的坑: (许诺的那篇文章链接如下) 如何用sql在1分钟从1T数据中精准定位查询?Hive离线数仓 Spark分析-CSDN博客文章浏览阅读1.2k次,点赞38次,收藏14次。在大数据-Hadoop体系中 ,…...
原生html+js播放flv直播视频流【vue等皆可用】
一、前言 最近着手了一个新需求:将某记录仪的实时视频在页面展现。 实现步骤: 通过WebRtc将直播视频转码为flv/rtsp格式流;通过Vlc或代码中的视频播放器播放视频。 常见播放flv直播视频流软件如:VLC、PotPlayer等,…...
初学java第一天:写一下熟悉的猜数字小游戏
初学java,不知道bug多不多,为了整理凌乱的思绪,写一个实践一下,跟C好像啊 简单来说,初学java确实有一点难度,但是大部分知识和思想和C语言和python相似,所以写起来还行,注意是对一些…...
【C++】如何判断类型
typeid的缺点 typeid对多态的情况不支持 #include <iostream>class Parent { public:Parent() {} private:int a 0; };class Child :public Parent { public :Child() {} private:int b 0; };int main() {Parent* obj1 new Child();Parent* pobj1 obj1;std::cout &…...
让一切发生皆有利于我,在人生的长河中,我们常常面临诸多的不确定性和变化
让一切发生皆有利于我,在人生的长河中,我们常常面临诸多的不确定性和变化。如何在这纷繁复杂的世界中保持内心的坚定,以积极的姿态应对生活的起伏,是我们一生都需要探索的课题。“一切发生皆有利于我”,这是一种心态;“让一切发生皆有利于我”,这是一种策略。这一深刻的…...
腾讯云AI代码助手:智能AI代码助手 ,新一代的高效代码开发辅助工具
前言 近些年是一个科技大爆发的时代,自从大模型发布以来越来越多的科技产品出现。例如去年的智能编码助手自出现以来,各大老牌大厂腾讯,百度 阿里也都紧随其后,智能编码助手的出现可以说大大的节省了我们写一些冗余代码的时间成本…...
C#:索引器 集合初始化器 事件访问器 枚举器 迭代器
1.索引器 就是有参属性 ,这个属性的get访问器接受 一个或多个参数 ,set访问器接受 两个或多个参数 <<via c#>>第10.2节 索引器可以被是被智能的数组 ,属性封装了类中的一个值,而索引器 封装了一组值,使用索引器时,语法和使用数组一样 <<c#从入门到精…...
css伪类选择器、盒子模型等
一、伪类选择器 1.1查找单个元素 根据元素的结构关系查找元素 查找第一个元素:标签名:first-child 查找最后一个元素:标签名:last-child 查找第n个元素:标签名:nth-child(n) 1.2查找多个元素 :nth-child(公式…...
opencv-python图像增强三:图像清晰度增强
文章目录 一、简介:二、图像清晰度增强方案:三、算法实现步骤3.1高反差保留实现3.2. usm锐化3.3 Overlay叠加 四:整体代码实现五:效果 一、简介: 你是否有过这样的烦恼,拍出来的照片总是不够清晰ÿ…...
第130天:内网安全-横向移动PTH哈希PTT 票据PTK密匙Kerberos密码喷射
环境搭建 这里这个环境继续上一篇文章搭建的环境 案例一:域横向移动-PTH-Mimikatz&NTLM 什么是pth? PTH Pass The Hash ,通过密码散列值 ( 通常是 NTLM Hash) 来进行攻击。在域环境中,用户登录计算机时使用的域账号&…...
SB3045LFCT-ASEMI无人机专用SB3045LFCT
编辑:ll SB3045LFCT-ASEMI无人机专用SB3045LFCT 型号:SB3045LFCT 品牌:ASEMI 封装:TO-220F 批号:最新 最大平均正向电流(IF):30A 最大循环峰值反向电压(VRRM&…...
RPA财务机器人是什么,RPA的具体应用场景有哪些?| 实在RPA研究
数字化转型关键期,越来越多的人工智能及超自动化技术在企业财务工作中得以普及应用,以提升财务工作效率,促进财务部门实现 RPA财务机器人是什么? RPA,即机器人流程自动化(Robotic Process Automation&#…...
滑动窗口 | Java | (hot100) 力扣 3
力扣 3.无重复字符的最长子串 暴力法:双层for循环,i-j的字符查重 滑动窗口:因为这题被分在这个类别里,那么已知要用滑动窗口,思路应该是什么。 反正我想不出来…… 看了别人的题解写出来的出错点:特别容易…...
【产品经理】竞品分析怎么理解?拆解一下
什么叫竞品?(研究的对象) 竞品看你怎么理解,有时候不一定是你的竞争对手,有可能是其他行业也做了这个功能,那你也可以学习,有类似的功能或者策略都可以学习,不过这个可能在管理学上…...
合规性导航:处理爬虫数据用于机器学习的最佳实践
在数据驱动的时代,机器学习已成为企业和研究者的重要工具。然而,使用爬虫技术抓取的数据进行机器学习时,合规性问题不容忽视。本文将详细探讨在使用爬虫抓取的数据进行机器学习时可能遇到的合规性问题,并提供相应的最佳实践。 一…...
spring中使用到的设计模式有哪些
Spring 框架是一个高度模块化和灵活的框架,广泛使用了各种设计模式来实现其核心功能和架构。这些设计模式帮助 Spring 提供了高可配置性、可扩展性和可维护性。以下是 Spring 框架中使用到的一些关键设计模式:...
splitcontainer控件设置固定大小
要设置SplitContainer控件以固定的大小,可以通过设置SplitContainer的FixedPanel属性来实现。您还需要设置IsSplitterFixed属性为true来锁定分割条的大小,并且通过设置SplitterWidth或SplitterLength属性来调整分割条的宽度或高度。 以下是一个示例代码…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
