28. 找出字符串中第一个匹配项的下标(力扣LeetCode)
文章目录
- 28. 找出字符串中第一个匹配项的下标
- 题目描述
- 暴力
- KMP算法
28. 找出字符串中第一个匹配项的下标
题目描述
给你两个字符串 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 仅由小写英文字符组成
暴力
// 定义Solution类
class Solution {
public:// strStr函数接受两个字符串参数:haystack(主字符串)和needle(子串)int strStr(string haystack, string needle) {// 初始化count变量来跟踪匹配的连续字符数int count=0;// 初始化k变量来跟踪needle字符串中的当前位置int k=0;// 遍历haystack字符串for(int i=0; i<haystack.size(); i++){// 如果当前字符匹配,增加count并移动到needle的下一个字符if(haystack[i] == needle[k]){count++;k++;// 打印出当前的匹配长度(主要用于调试)cout << count << endl;// 如果全部字符都匹配,返回第一个匹配字符的下标if(count == needle.size())return i - count + 1;}// 如果当前字符不匹配else{// 重置i为上一个匹配序列的开始的下一个位置i = i - count;// 重置count和k为0,重新开始匹配count = 0;k = 0;}}// 如果遍历了整个haystack都没有找到完全匹配的needle,返回-1return -1;}
};
重要的代码段解释:
- int i=0; i<haystack.size(); i++: 这个循环遍历主字符串haystack。
- if(haystack[i] == needle[k]): 检查当前haystack的字符是否与needle的当前字符匹配。
- count++; k++;: 如果匹配,增加count(匹配的字符数)并且k增加,使得下一次循环检查needle的下一个字符。
- if(count == needle.size()): 如果count等于needle的长度,说明已经找到一个完全的匹配,返回第一个匹配的下标。
- else分支: 当一个不匹配发生时,代码会重置i到当前检查序列的开始的下一个字符,并重置count和k为0,意味着重新开始匹配。
需要注意的是,这段代码的性能并不是最优的,因为在发现一个字符不匹配时,它会回溯到上一个匹配序列的开始后面一个字符重新开始匹配,可能会导致多次重复检查同一个字符。更高效的字符串匹配算法如KMP算法能够在不回溯主字符串的情况下继续匹配。
KMP算法
不懂KMP算法的看这篇文章:28. 实现 strStr()
构造next数组图解
// 定义解决方案类
class Solution {
public:// strStr成员函数,接受两个字符串:haystack(搜索范围)和needle(目标字符串)int strStr(string haystack, string needle) {// 定义一个数组next用于存储KMP算法中的部分匹配表int next[needle.size()];// 计算needle的部分匹配表getnext(next, needle);//得到next数组// 定义一个指针j,用于指向needle的当前匹配位置//这里的i和j理解和下面getnext函数中类似//因为要回退的是j,所以j对应的是needle//所以i对应haystackint j=0;// 遍历haystack字符串for(int i=0; i<haystack.size(); i++) {// 使用while循环处理不匹配的情况// 如果j大于0且当前字符不匹配,则回退j到部分匹配的位置while(j > 0 && haystack[i] != needle[j]) {j=next[j-1];}// 如果当前字符匹配,则指针j递增if(haystack[i] == needle[j]) {j++;}// 如果j的值等于needle的长度,则表明找到了完整匹配// 返回匹配的起始下标if(j == needle.size()) {return i - needle.size() + 1;}}// 如果没有找到匹配,返回-1return -1;}private:// getnext函数用于计算KMP算法中的部分匹配表void getnext(int *next, const string& s) {// 初始化j为0,j指向前缀的末尾位置int j=0;// next数组的第一个元素总是0next[0]=0;//0的位置也是回退到0// 使用for循环计算next数组的其余部分for(int i=1; i<s.size(); i++) {//要比较前后缀是否相等,i从1开始,且i最后指向后缀末尾位置(s.size()-1)// 如果前后缀不相同,回退j的位置while(j > 0 && s[i] != s[j]) {j=next[j-1];//j进行回退}// 如果前后缀相同,j递增if(s[i] == s[j]) {j++;}// 更新next数组//更新分两种情况://第一种:相等时就更新//第二种:不相等时,j回退到0时更新为0next[i] = j;}}
};
这段代码中的KMP算法包含两个主要部分:
-
getnext()函数计算部分匹配表(也就是next数组)。部分匹配表是KMP算法的核心,它记录了模式字符串needle中的前后缀的最长公共元素的长度。在搜索过程中不匹配时,可以利用这个信息跳过一些不必要的比较。
-
strStr()函数使用部分匹配表来加速搜索过程。当出现不匹配的情况时,不用像暴力搜索那样从头开始比较,而是根据next数组回退到某一位置继续比较。
相关文章:

28. 找出字符串中第一个匹配项的下标(力扣LeetCode)
文章目录 28. 找出字符串中第一个匹配项的下标题目描述暴力KMP算法 28. 找出字符串中第一个匹配项的下标 题目描述 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。…...
1 开源鸿蒙OpenHarmony niobe407 STM32F407IGT6芯片轻型系统全量源码4.1版本下载流程
开源鸿蒙OpenHarmony niobe407 STM32F407IGT6芯片轻型系统全量源码4.1版本下载流程 作者将狼才鲸日期2024-02-27 一、前景提要 如果通过DevEco Marketplace网站获取下载源码的话,不全,有些板子下不到;OpenHarmony开发板列表,官方…...

洛谷C++简单题小练习day21—梦境数数小程序
day21--梦境数数--2.25 习题概述 题目背景 Bessie 处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。 题目描述 Bessie 的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码(0…9&#x…...

LabVIEW高精度闭式微小型循环泵性能测试
LabVIEW高精度闭式微小型循环泵性能测试 开发了一套基于LabVIEW的高精度闭式微小型循环泵性能测试系统,旨在通过先进的测试技术和虚拟仪器技术,对微小型循环泵的性能进行精确测量和分析,从而优化泵的设计和性能,提高其在航空、机…...

同局域网共享虚拟机(VMware)
一、前言 首先我们先来了解下 VMware 的三种网络模式桥接模式、NAT模式、仅主机模式,网络类型介绍详情可以参考下我之前的文档 Linux系统虚拟机安装(上)第三章 - 第9步指定网络类型。了解三种网络模式的原理之后,再来剖析下需求&…...
docker学习快速入门
目录 Linux下安装docker配置阿里云镜像加速docker命令部署安装Tomcat、ES容器数据卷DockerFiledocker网络制作tomcat镜像Redis集群部署SpringBoot微服务打包docker镜像拓展 什么是Docker Docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例。服务…...
大语言模型LLM推理加速:LangChain与ChatGLM3-6B的推理加速技术(LLM系列11)
文章目录 大语言模型LLM推理加速:LangChain与ChatGLM3-6B的推理加速技术(LLM系列11)引言LangChain框架下的推理优化LangChain的核心理念与功能特点分布式计算与知识图谱集成优化推理路径实例分析:使用链式查询与缓存机制提升模型推…...

GSVA -- 学习记录
文章目录 1.原理简介2. 注意事项3. 功能实现代码实现部分 4.可视化5.与GSEA比较 1.原理简介 Gene Set Variation Analysis (GSVA) 基因集变异分析。可以简单认为是样本数据中的基因根据表达量排序后形成了一个rank list,这个rank list 与 预设的gene setsÿ…...

基于Springboot的旅游网管理系统设计与实现(有报告)。Javaee项目,springboot项目。
演示视频: 基于Springboot的旅游网管理系统设计与实现(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层…...

Docker基础篇(六) dockerfile体系结构语法
FROM:基础镜像,当前新镜像是基于哪个镜像的 MAINTAINER :镜像维护者的姓名和邮箱地址 RUN:容器构建时需要运行的命令 EXPOSE :当前容器对外暴露出的端口号 WORKDIR:指定在创建容器后,终端默认登…...
【Python编程+数据清洗+Pandas库+数据分析】
数据分析的第一步往往是数据清洗,这个过程关键在于理解、整理和清洗原始数据,为进一步分析做好准备。Python 语言通过Pandas库提供了一系列高效的数据清洗工具。接下来,该文章将通过一个简单的案例演示如何利用 Pandas 进行数据清洗ÿ…...
网络安全之防御保护8 - 11 天笔记
一、内容安全 1、攻击可能只是一个点,防御需要全方面进行 2、IAE引擎 3、DFI和DPI技术 --- 深度检测技术 深度行为检测技术分为:深度包检测技术(DPI)、深度流检测技术(DFI) DPI --- 深度包检测技术 --- 主要针对完整的数据包…...

LiveGBS流媒体平台GB/T28181功能-查看国标设备下通道会话列表直播|回放|对讲|播放|录像|级联UDP|TCP|H264|H265会话
LiveGBS流媒体平台GB/T28181功能-查看直播|回放|对讲|播放|录像|级联UDP|TCP|H264|H265会话 1、会话列表2、会话类型3、搭建GB28181视频直播平台 1、会话列表 LiveGBS-> 国标设备-》点击在线状态 点击会话列表 2、会话类型 下拉会话类型可以看到 直播会话、回放会话、下载…...

Python和Jupyter简介
在本notebook中,你将: 1、学习如何使用一个Jupyter notebook 2、快速学习Python语法和科学库 3、学习一些IPython特性,我们将在之后教程中使用。 这是什么? 这是只为你运行在一个个人"容器"中的一个Jupyter noteboo…...

Linux——静态库
Linux——静态库 静态库分析一下 ar指令生成静态库静态库的使用第三方库优化一下 gcc -I(大写的i) -L -l(小写的l),头文件搜索路径,库文件搜索路径,连接库 今天我们来学习静态库的基本知识。 静态库 在了解静态库之前,我们首先来…...

fastjson序列化MessageExt对象问题(1.2.78之前版本)
前言 无论是kafka,还是RocketMq,消费者方法参数中的MessageExt对象不能被 fastjson默认的方式序列化。 一、查看代码 Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,ConsumeConcurrentlyContext context) {t…...

osi模型,tcp/ip模型(名字由来+各层介绍+中间设备介绍)
目录 网络协议如何分层 引入 osi模型 tcp/ip模型 引入 命名由来 介绍 物理层 数据链路层 网络层 传输层 应用层 中间设备 网络协议如何分层 引入 我们已经知道了网络协议是层状结构,接下来就来了解了解下网络协议如何分层 常见的网络协议分层模型是OSI模型 和 …...

ElasticSearch之找到乔丹的空中大灌篮电影
写在前面 本文看一个搜索的实际例子,找到篮球之神乔丹的电影Space Jam,即空中大灌篮。 正式开始之前先来看下要查询的目标文档,以及查询的text: 要查询的目标文档 {..."title": "Space Jam",..."ove…...
CSS @符规则(@font-face、@keyframes、@media、@scope等)
随着前端开发的不断发展,CSS 的功能日益强大,其中 规则扮演着举足轻重的角色。它们不仅扩展了 CSS 的功能边界,还为开发者提供了更加灵活和高效的样式定义方式,让我们来一同探索这些强大而实用的 规则吧! font-face …...

uniapp微信小程序解决上方刘海屏遮挡
问题 在有刘海屏的手机上,我们的文字和按钮等可能会被遮挡 应该避免这种情况 解决 const SYSTEM_INFO uni.getSystemInfoSync();export const getStatusBarHeight ()> SYSTEM_INFO.statusBarHeight || 15;export const getTitleBarHeight ()>{if(uni.get…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...