当前位置: 首页 > news >正文

28. 找出字符串中第一个匹配项的下标【 力扣(LeetCode) 】

一、题目描述

  给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。

二、测试用例

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 06 处匹配。
第一个匹配项的下标是 0 ,所以返回 0

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1

提示:

1 <= haystack.length, needle.length <= 104
haystack 和 needle 仅由小写英文字符组成

三、解题思路

  1. 基本思路:
      采用KMP算法;
  2. 具体思路:
    • 计算 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 。

四、参考代码

时间复杂度: 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 &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 二、测试用例 示例 1&#xff1a; 输…...

邀请函 I 松下信息和望繁信科技邀您参加「数智时代下大数据应用的“道”与“术”」闭门会议

在数字化浪潮席卷全球的今天&#xff0c;大数据与智能化的结合成为企业成功的关键。为了深入探讨这一重要议题&#xff0c;松下信息系统&#xff08;上海&#xff09;有限公司&#xff08;简称“松下信息”&#xff09;与上海望繁信科技有限公司&#xff08;简称“望繁信科技”…...

Node.js中的fs.watchFile与fs.unwatchFile:文件监控与取消监控

在Node.js中&#xff0c;对文件系统的操作是非常常见的需求。有时&#xff0c;我们需要对某个文件的变化进行实时监控&#xff0c;并在文件内容或元数据发生变化时执行相应的操作。Node.js的fs模块提供了watchFile和unwatchFile两个方法&#xff0c;用于实现文件的监控和取消监…...

Hadoop大集群配置文档-粗略版-3万字长文 (包括hive,zookeeper,hbase,flume等中间件和mysql等)

先填一下上次许诺的坑&#xff1a; &#xff08;许诺的那篇文章链接如下&#xff09; 如何用sql在1分钟从1T数据中精准定位查询&#xff1f;Hive离线数仓 Spark分析-CSDN博客文章浏览阅读1.2k次&#xff0c;点赞38次&#xff0c;收藏14次。在大数据-Hadoop体系中 &#xff0c;…...

原生html+js播放flv直播视频流【vue等皆可用】

一、前言 最近着手了一个新需求&#xff1a;将某记录仪的实时视频在页面展现。 实现步骤&#xff1a; 通过WebRtc将直播视频转码为flv/rtsp格式流&#xff1b;通过Vlc或代码中的视频播放器播放视频。 常见播放flv直播视频流软件如&#xff1a;VLC、PotPlayer等&#xff0c;…...

初学java第一天:写一下熟悉的猜数字小游戏

初学java&#xff0c;不知道bug多不多&#xff0c;为了整理凌乱的思绪&#xff0c;写一个实践一下&#xff0c;跟C好像啊 简单来说&#xff0c;初学java确实有一点难度&#xff0c;但是大部分知识和思想和C语言和python相似&#xff0c;所以写起来还行&#xff0c;注意是对一些…...

【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代码助手 ,新一代的高效代码开发辅助工具

前言 近些年是一个科技大爆发的时代&#xff0c;自从大模型发布以来越来越多的科技产品出现。例如去年的智能编码助手自出现以来&#xff0c;各大老牌大厂腾讯&#xff0c;百度 阿里也都紧随其后&#xff0c;智能编码助手的出现可以说大大的节省了我们写一些冗余代码的时间成本…...

C#:索引器 集合初始化器 事件访问器 枚举器 迭代器

1.索引器 就是有参属性 ,这个属性的get访问器接受 一个或多个参数 ,set访问器接受 两个或多个参数 <<via c#>>第10.2节 索引器可以被是被智能的数组 ,属性封装了类中的一个值,而索引器 封装了一组值,使用索引器时,语法和使用数组一样 <<c#从入门到精…...

css伪类选择器、盒子模型等

一、伪类选择器 1.1查找单个元素 根据元素的结构关系查找元素 查找第一个元素&#xff1a;标签名:first-child 查找最后一个元素&#xff1a;标签名&#xff1a;last-child 查找第n个元素&#xff1a;标签名&#xff1a;nth-child(n) 1.2查找多个元素 :nth-child(公式&#xf…...

opencv-python图像增强三:图像清晰度增强

文章目录 一、简介&#xff1a;二、图像清晰度增强方案&#xff1a;三、算法实现步骤3.1高反差保留实现3.2. usm锐化3.3 Overlay叠加 四&#xff1a;整体代码实现五&#xff1a;效果 一、简介&#xff1a; 你是否有过这样的烦恼&#xff0c;拍出来的照片总是不够清晰&#xff…...

第130天:内网安全-横向移动PTH哈希PTT 票据PTK密匙Kerberos密码喷射

环境搭建 这里这个环境继续上一篇文章搭建的环境 案例一&#xff1a;域横向移动-PTH-Mimikatz&NTLM 什么是pth&#xff1f; PTH Pass The Hash &#xff0c;通过密码散列值 ( 通常是 NTLM Hash) 来进行攻击。在域环境中&#xff0c;用户登录计算机时使用的域账号&…...

SB3045LFCT-ASEMI无人机专用SB3045LFCT

编辑&#xff1a;ll SB3045LFCT-ASEMI无人机专用SB3045LFCT 型号&#xff1a;SB3045LFCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;30A 最大循环峰值反向电压&#xff08;VRRM&…...

RPA财务机器人是什么,RPA的具体应用场景有哪些?| 实在RPA研究

数字化转型关键期&#xff0c;越来越多的人工智能及超自动化技术在企业财务工作中得以普及应用&#xff0c;以提升财务工作效率&#xff0c;促进财务部门实现 RPA财务机器人是什么&#xff1f; RPA&#xff0c;即机器人流程自动化&#xff08;Robotic Process Automation&#…...

滑动窗口 | Java | (hot100) 力扣 3

力扣 3.无重复字符的最长子串 暴力法&#xff1a;双层for循环&#xff0c;i-j的字符查重 滑动窗口&#xff1a;因为这题被分在这个类别里&#xff0c;那么已知要用滑动窗口&#xff0c;思路应该是什么。 反正我想不出来…… 看了别人的题解写出来的出错点&#xff1a;特别容易…...

【产品经理】竞品分析怎么理解?拆解一下

什么叫竞品&#xff1f;&#xff08;研究的对象&#xff09; 竞品看你怎么理解&#xff0c;有时候不一定是你的竞争对手&#xff0c;有可能是其他行业也做了这个功能&#xff0c;那你也可以学习&#xff0c;有类似的功能或者策略都可以学习&#xff0c;不过这个可能在管理学上…...

合规性导航:处理爬虫数据用于机器学习的最佳实践

在数据驱动的时代&#xff0c;机器学习已成为企业和研究者的重要工具。然而&#xff0c;使用爬虫技术抓取的数据进行机器学习时&#xff0c;合规性问题不容忽视。本文将详细探讨在使用爬虫抓取的数据进行机器学习时可能遇到的合规性问题&#xff0c;并提供相应的最佳实践。 一…...

spring中使用到的设计模式有哪些

Spring 框架是一个高度模块化和灵活的框架&#xff0c;广泛使用了各种设计模式来实现其核心功能和架构。这些设计模式帮助 Spring 提供了高可配置性、可扩展性和可维护性。以下是 Spring 框架中使用到的一些关键设计模式&#xff1a;...

splitcontainer控件设置固定大小

要设置SplitContainer控件以固定的大小&#xff0c;可以通过设置SplitContainer的FixedPanel属性来实现。您还需要设置IsSplitterFixed属性为true来锁定分割条的大小&#xff0c;并且通过设置SplitterWidth或SplitterLength属性来调整分割条的宽度或高度。 以下是一个示例代码…...

Koikatu HF Patch终极安装指南:5步解锁游戏全部潜力

Koikatu HF Patch终极安装指南&#xff1a;5步解锁游戏全部潜力 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch 还在为Koikatu游戏体验不完整而烦…...

分人群AI建站工具解决方案:中小企、创业者、外贸人、创作者怎么选?

分人群AI建站工具解决方案&#xff1a;中小企、创业者、外贸人、创作者怎么选&#xff1f;同样是找“AI建站工具”&#xff0c;一个个体摄影师和一个初创公司老板&#xff0c;心里的需求清单可能完全不同。这篇内容我们就来对不同人群&#xff0c;分别给出适合的建站思路和工具…...

基于数据预处理与PSO-SVM的风功率预测聚类研究

在风功率预测聚类中&#xff0c;我们使用了数据预处理和PSO-SVM方法。首先&#xff0c;我们使用DBCAN算法提取了风功率异常数据&#xff0c;并使用KMEANS算法对处理后的数据进行聚类。我们进行了三类仿真实验设置。基于上述聚类结果&#xff0c;我们采用粒子群算法&#xff08;…...

告别重复劳动:用快马AI自动生成数据清洗与分析脚本

告别重复劳动&#xff1a;用快马AI自动生成数据清洗与分析脚本 最近接手了一个销售数据分析的项目&#xff0c;需要处理大量CSV格式的销售记录。每次手动清洗数据、计算指标都要花上大半天时间&#xff0c;这种重复劳动实在太低效了。好在发现了InsCode(快马)平台的AI代码生成…...

NPS内网穿透实战:如何为本地站点快速配置HTTPS(含防火墙设置)

NPS内网穿透实战&#xff1a;如何为本地站点快速配置HTTPS&#xff08;含防火墙设置&#xff09; 在数字化转型浪潮中&#xff0c;远程访问内网资源的需求日益增长。想象一下这样的场景&#xff1a;你正在开发一个本地Web应用&#xff0c;需要让异地同事实时测试&#xff1b;或…...

Python flask django框架的环保公益活动管理与宣传系统的设计与开发

目录同行可拿货,招校园代理 ,本人源头供货商环保公益活动管理与宣传系统的功能分析用户管理模块活动管理模块报名与签到系统宣传与分享功能数据统计与分析消息通知系统地图与导航集成积分与奖励机制后台管理系统项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主…...

实战高效:Binance Trade Bot终极加密货币自动交易指南

实战高效&#xff1a;Binance Trade Bot终极加密货币自动交易指南 【免费下载链接】binance-trade-bot Automated cryptocurrency trading bot 项目地址: https://gitcode.com/gh_mirrors/bi/binance-trade-bot Binance Trade Bot 是一款专业的自动化加密货币交易工具&a…...

快速原型验证:如何用快马AI一键生成50台云桌面的基础管理脚本

快速原型验证&#xff1a;如何用快马AI一键生成50台云桌面的基础管理脚本 最近在研究虚拟化技术&#xff0c;想验证一个想法&#xff1a;一台主机能否支撑50台云桌面的运行&#xff1f;传统方式搭建测试环境太费时&#xff0c;手动配置KVM或Docker既复杂又容易出错。好在发现了…...

3分钟掌握:让PPT公式排版效率提升10倍的LaTeX插件使用指南

3分钟掌握&#xff1a;让PPT公式排版效率提升10倍的LaTeX插件使用指南 【免费下载链接】latex-ppt Use LaTeX in PowerPoint 项目地址: https://gitcode.com/gh_mirrors/la/latex-ppt 在学术报告和技术演示中&#xff0c;数学公式的排版质量直接影响内容专业性。然而&am…...

claw-code 源码详细分析:命令宇宙 vs 工具宇宙——`commands` / `tools` 镜像清单如何驱动路由与 shim 执行?

涉及源码&#xff1a;src/reference_data/commands_snapshot.json、tools_snapshot.json&#xff0c;src/commands.py、src/tools.py、src/execution_registry.py、src/runtime.py、src/main.py&#xff0c;src/models.py&#xff08;PortingModule&#xff09;。1. 「两个宇宙…...