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.确认订单功能 使用场景是:用户在选择好购物车后,或者是直接选择商品后(选择商品封装为购物车) 这样做是根据尚硅谷来学习的 目前需要这些属性,原因是在确认订单页面后…...

解决域名加别名后再代理或者映射到fastadmin项目
如果遇到微应用不想再添加或者不方便添加单独的二级域名时,就需要用到代理或者映射来进入到我们的微应用项目中。 可以修改route.php路由文件的下面这个参数 __alias__ > [别名 > 模块/控制器] 如图 然后再修改config.php文件里面的view_replace_str参数…...

Armv9.5架构新增的关键扩展--精简版
Armv9.5架构扩展是对Armv9.4的扩展。它增加了强制性和可选的架构特性。有些特性必须一起实现。实现是符合Armv9.5规范,需要满足以下条件: 符合/兼容Armv9.4规范包含所有Armv9.5架构的强制性特性。符合Armv9.5规范的实现还可以包括: Armv9.5的可选特性以下是arm9.5架构中关键…...

STM32 GPIO 模块
B站视频地址:芯片内部GPIO模块细节 引脚 将 STM32 芯片,类比为【大脑】 而旁边的引脚,类比为【神经】 通过引脚,使得,STM32,可以和外部世界,进行交流 比如,当我们和别人说话时&am…...

网络剪枝——network-slimming 项目复现
目录 文章目录 目录网络剪枝——network-slimming 项目复现clone 存储库Baselinevgg训练结果 resnet训练结果 densenet训练结果 Sparsityvgg训练结果 resnet训练结果 densenet训练结果 Prunevgg命令结果 resnet命令结果 densenet命令结果 Fine-tunevgg训练结果 resnet训练结果 …...

Spring 懒加载的实际应用
引言 在 Spring 框架中,懒加载机制允许你在应用程序运行时延迟加载 Bean。这意味着 Bean 只会在第一次被请求时才实例化,而不是在应用程序启动时就立即创建。这种机制可以提高应用程序的启动速度,并节省内存资源。 Spring 的懒加载机制 懒…...

PyQT 串口改动每次点开时更新串口信息
class MainWindow(QWidget, Ui_Form):def __init__(self):super().__init__(parentNone)self.setupUi(self)self.comboBox.installEventFilter(self) # 加载事件过滤器self.comboBox.addItems(get_ports())def eventFilter(self, obj, event): # 定义事件过滤器if isinstance(o…...

三级_网络技术_19_路由器的配置及使用
1.在Cisco路由器上配置DHCP服务,使得客户端可以分配到的地址范围是222.28.71.2-222.28.71.200地址租用时间是2小时30分钟,不记录地址冲突日志默认路由是222.28.71.1,分配的dns服务器地址是222.28126.27和222.28.126.26。以下配置完全正确的是…...

【STM32 Blue Pill编程】-STM32CubeIDE开发环境搭建与点亮LED
开发环境搭建与点亮LED 文章目录 开发环境搭建与点亮LED1、STM32F103C8T6及STM32 Blue Pill 介绍2、下载并安装STM32CubeIDE3、编程并点亮LED3.1 在Stm32CubeIDE中编写第一个STM32程序3.1.1 创建项目3.1.2 设备配置3.1.2.1 系统时钟配置3.1.2.2 系统调试配置3.1.2.3 GPIO配置3.…...

【数据结构】六、图:4.图的遍历(深度优先算法DFS、广度优先算法BFS)
三、基本操作 文章目录 三、基本操作1.图的遍历1.1 深度优先遍历DFS1.1.1 DFS算法1.1.2 DFS算法的性能分析1.1.3 深度优先的生成树和生成森林 1.2 广度优先遍历BFS1.2.1 BFS算法1.2.2 BFS算法性能分析1.2.3 广度优先的生成树和生成森林 1.3 图的遍历与图的连通性 1.图的遍历 图…...