Leetcode刷题(二十八)

找出字符串中第一个匹配项的下标(Easy)

给你两个字符串 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 仅由小写英文字符组成
Related Topics
双指针
字符串
字符串匹配

思路分析

这道题是很经典的字符串匹配算法,这里第一个想到的就是KMP字符串匹配算法,这是很经典的数据结构算法,直接使用该算法就可以完成这道题。

这里我来复习一下什么是KMP算法:
首先我们要知道朴素字符串匹配会导致指针不断进行回溯,导致浪费。而KMP算法中的目标指针并不回溯,而是模式串的指针根据得到的next[]数组来进行部分回溯,并且不会重复比对一定相同的字符串。这样就节省了很多时间。比如说目标串为:ABCABEABCABCMN,模式串为:ABCABCMN。由这个例子可以看出,如果是朴素匹配,那么在对比到第一个E出现之后指针就有进行回溯,回溯到目标串[1]的位置,
在这里插入图片描述

但是如果使用kmp算法,那么目标串的指针并不需要回溯,只需要根据next矩阵来回溯模式串的指针,这里需要回溯到模式串[2]的位置,以此类推。
在这里插入图片描述
KMP算法的核心就是如何计算模式串的next[]数组,要想理解如何计算该数组,首先要了解最长相同前后缀的概念。举一个例子就可以明白了,模式串ABCXABCMN,这里对于M位置的前缀:ABC,后缀:ABC.这里要注意,你想找某个位置的最长相同前后缀,那么后缀就不能包括这个位置,比如上面的例子就不包括M。那么这里我们同时也要说一下next数组中元素的含义就是回溯的位置,next[j] = i 的意思就是位置j的元素回溯到位置i。这里我们来看一下求next的公式。
在这里插入图片描述
公式通俗的解释就是1.当存在相同前后缀的时候,next[i]的值表示下标为i的字符前的字符串最长相等前后缀的长度。2. j = 0 的时候,也就是字符串第一个元素的时候,初始化为 -1。 3.其他没有相同前后缀的情况,设置为 0 .

同时要了解KMP算法还存在弊端,还可以继续优化,但这里就不再赘述,网上有很多讲解,这里主要还是刷题。

代码实现

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {public int strStr(String haystack, String needle) {int flag = -1;int j = 0;int i = 0;int[] next = builtNext(needle);while (i < haystack.length() && j < needle.length()){if (j == -1 || haystack.charAt(i) == needle.charAt(j)){j++;i++;}else {j = next[j];}if (j == needle.length()) flag = i-j;//返回匹配开始的位置}return flag;}
//计算NEXT数组public int[] builtNext(String needle){int j = 0;int k = -1;int[] next = new int[needle.length()];next[0] = -1;while (j < needle.length()-1){if (k == -1 || needle.charAt(k) == needle.charAt(j)){k++;j++;next[j] = k;}else {k = next[k];}}return next;}
}
//leetcode submit region end(Prohibit modification and deletion)

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

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

相关文章

基于springboot+vue的“衣依”服装销售平台系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

VSCode Debug 参数设置说明

如果想在vscode中debug一个项目&#xff0c;比如python3 run.py --args 这个时候你需要着重关注几个参数&#xff0c;参数用两个双引号分开&#xff0c;不能有空格。 cwd :运行代码的基础目录env: 设置环境变量 PYTHONPATH&#xff1a; 设置项目用到的模块搜索路径&#xff…

在PyCharm中安装GitHub Copilot插件,login之后报出如下错误:

Sign in failed. Reason: Request signInInitiate failed with message: connect ECONNABORTED 20.205.243.166:443, request id: 7, error code: -32603 前提&#xff1a; 设置网址&#xff1a;https://github.com/settings/copilot&#xff0c;已设置为允许 或者&#xff1…

工业智能网关储能物联网应用实现能源的高效利用及远程管理

储能电力物联网是指利用物联网技术和储能技术相结合&#xff0c;实现对电力系统中各种储能设备的智能管理和优化控制。随着可再生能源的不断发展和应用&#xff0c;电力系统面临着越来越大的电力调度和储能需求而储能电力物联网的出现可以有效解决这一问题&#xff0c;提高电力…

Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))

目录 AOP概念AOP底层原理AOP(JDK动态代理)使用 JDK 动态代理&#xff0c;使用 Proxy 类里面的方法创建代理对象**编写** **JDK** 动态代理代码 AOP(术语)AOP操作&#xff08;准备工作&#xff09;**AOP** **操作&#xff08;**AspectJ注解)**AOP** **操作&#xff08;**AspectJ…

前端开发WebStorm

WebStorm是一款功能强大的JavaScript集成开发环境&#xff0c;凭借智能代码补全、实时分析和代码重构、集成版本控制、强大的调试和测试工具、实时预览和集成前端工具以及自定义配置和插件支持等功能&#xff0c;成为开发者首选的利器。 前端开发WebStorm WebStorm是一款功能强…

Git学习 -- 分支合并、版本修改相关

目录 learn GIT Learn Git Branching merge和rebase的使用 基础命令 版本回退 工作区和暂存区 管理修改 撤销修改 删除修改 learn GIT Learn Git Branching 这是Gitee上的Git学习教程 Learn Git Branching Git Rebase Learn Git Branching 最终的实操 merge和rebase的…

杰理方案——WIFI连接物联网配置阿里云操作步骤

demo——DevKitBoard 注意&#xff1a;最好用这个Demo,其它Demo可能会有莫名其妙的错误问题。 wifi配置 需要在app_config.h文件中定义USE_DEMO_WIFI_TEST&#xff0c;工程会在wifi_demo_task.c文件中自动启动wifi相关的任务&#xff0c; 我们将工程配置为连接外部网络STA模式…

基于YOLOv8的摔倒行为检测系统(Python源码+Pyqt6界面+数据集)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:通过实战基于YOLOv8的摔倒行为检测算法&#xff0c;从数据集制作到模型训练&#xff0c;最后设计成为检测UI界面 人体行为分析AI算法&#xff0c;是一种利用人工智能技术对人体行为进行检测、跟踪和分析的方法。通过计算…

前端开发中的那些规范

开发中的那些规范 俗话说&#xff1a;无规矩不成方圆。生活如此、软件开发也如此。 来聊一聊开发中有哪些地方需要规范。 为什么需要规范 现在开发一个应用基本上都是多人协作&#xff0c;一旦涉及到多人&#xff0c;必然不同的开发者的开发习惯、编码方式都是有所不同的&…

QT发送request请求

时间记录&#xff1a;2024/1/23 一、使用步骤 &#xff08;1&#xff09;pro文件中添加network模块 &#xff08;2&#xff09;创建QNetworkAccessManager网络管理类对象 &#xff08;3&#xff09;创建QNetworkRequest网络请求对象&#xff0c;使用setUrl方法设置请求url&am…

电阻(一):压敏电阻

1、定义 压敏电阻&#xff08;Varistor | Voltage Dependent Resistor&#xff09;&#xff1a;是一种具有非线性伏安特性的电阻器件&#xff0c;其电阻值会随外部电压而改变&#xff0c;主要用于在电路承受过压时进行电压钳位&#xff0c;吸收多余的电流以保护敏感器件。 2、…

【江科大】STM32:USART串口(理论部分)上

串口 全双工&#xff1a;可以进行同步通信 单端信号&#xff1a;信号线传输的就是单端信号。&#xff08;也就是与地线&#xff08;GND&#xff09;的电势差&#xff09; 缺点&#xff1a;防干扰能力差 原因&#xff1a;当信号从A点传输到B点&#xff0c;理想条件是A&#xff0…

对齐大型语言模型与人类偏好:通过表示工程实现

1、写作动机&#xff1a; 强化学习表现出相当复杂度、对超参数的敏感性、在训练过程中的不稳定性&#xff0c;并需要在奖励模型和价值网络中进行额外的训练&#xff0c;导致了较大的计算成本。为了解决RL方法带来的上述挑战&#xff0c;提出了几种计算上轻量级的替代方案&…

K8S四层代理Service-02

Service的四种类型使用 ClusterIP使用示例Pod里使用service的服务名访问应用 NodePort使用示例 ExternalName使用示例 LoadBalancer K8S支持以下4种Service类型&#xff1a;ClusterIP、NodePort、ExternalName、LoadBalancer 以下是使用4种类型进行Service创建&#xff0c;应对…

Datawhale 强化学习笔记(四)结合策略梯度和价值函数的 Actor-Critic 算法

策略梯度算法的缺点 采样效率低。由于使用的是蒙特卡洛估计&#xff0c;与基于价值算法的时序差分估计相比其采样速度必然是要慢很多的&#xff0c;这个问题在前面相关章节中也提到过。高方差。虽然跟基于价值的算法一样都会导致高方差&#xff0c;但是策略梯度算法通常是在估…

HEGERLS智能物流机器人|场景为王 以存取为技术核心布局的仓储集群

随着物流需求的多样化、复杂化&#xff0c;四向穿梭车技术经过几年的蓬勃发展&#xff0c;正在各领域迎来愈加广泛的应用。河北沃克作为该领域的代表&#xff0c;凭借庞大的产品群、功能强大的软件系统以及资源丰富的生态合作伙伴体系实现了快速的发展。其中&#xff0c;海格里…

CSS实现三种常用的三角形效果

目录 前言 一、实现普通三角形效果 二、实现三角形的气泡框效果 三、实现空心三角形效果 四、总结 往期回顾 前言 CSS 提供了出色的方法可以实现基本的形状。本文就来看看如何使用这些方法来实现项目中常用的三种三角形效果。 一、实现普通三角形效果 实现步骤 &#…

每日一题——LeetCode1313.解压缩编码列表

这么简单的题目要说的这么复杂 nums里每相邻的两个元素nums[i]、nums[j]为一对&#xff0c;nums[i]表示nums[j]的次数 var decompressRLElist function(nums) {let res[]for(let i0,j1;j<nums.length-1;i2,j2){while(nums[i]--){res.push(nums[j])}}return res }; 消耗时…

Dify学习笔记-入门学习(二)

1、官方文档链接 https://docs.dify.ai/v/zh-hans/getting-started/readme 2、 Dify基础介绍 Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使开发者可以快速搭建生产级的生成…