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

【简单】力扣算法题解析LeetCode28:找出字符串中第一个匹配项的下标 本文介绍了一种高效的字符串匹配算法——Rabin-Karp算法(自然溢出版),用于在一个主串中查找子串首次出现的位置。算法核心思想是利用滚动哈希技术,通过预处理目标串的哈希值,然后在主串中滑动窗口计算当前子串的哈希值,若哈希匹配则进一步验证字符是否相等。该算法通过自然溢出优化取模运算,平均时间复杂度为O(n+m),空间复杂度为O(1)。文末提供了Java实现代码,并展示了在实际测试中的高效性能(0ms执行时间)。 阅读详情

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 仅由小写英文字符组成

题解

看到这个题我的第一想法就是KMP算法

暴力算法

暴力算法应该是最容易想到的算法,算法比较简单,我用下图来表示,要查找leetcode串中tco的开始索引位置。
暴力算法
通常主串(leetcode)叫做文本串,字串tco被叫做模式串,上图的做法就是循环文本串,判断文本串当前索引开始,后面是否一一都与模式串匹配,如果匹配,那就返回文本串开始匹配的索引位置,如果出现不匹配,则本次匹配结束,文本串继续向后移动一个位置,继续匹配,算法也很简单,如下:

class Solution {
    public int strStr(String text, String pattern) {
        int n = text.length();
        int m = pattern.length();
        for (int i = 0; i <= n - m; i++) {
            int j = 0;
            while (j < m) {
                if (text.charAt(i + j) != pattern.charAt(j)) {
                    break;
                }
                j++;
            }
            if (j == m) {
                return i;
            }
        }
        return -1;
    }
}

文本串循环的时候,条件i <= n - m是很有必要的,因为如果文本串当前位置到尾部的长度如果都不如模式串长了,那么也就无需循环比较了,必然不会匹配的。

提交结果:
暴力算法提交结果

时间复杂度是O(mn),其中m是模式串的长度,n是文本串的长度,空间复杂度是O(1)。

RK算法

请查看文章===> RK算法

未完待续

R语言WGCNA实战:从基因表达矩阵到模块可视化全流程(附避坑指南) 本文详细介绍了使用R语言进行WGCNA(加权基因共表达网络分析)的完整实战流程,涵盖从基因表达矩阵预处理、软阈值选择、网络构建与模块识别,到模块与表型关联分析及结果可视化的关键步骤。文章重点解析了代码实现,并提供了针对数据质量检查、参数调整等常见问题的避坑指南,帮助生物信息学研究者高效挖掘基因共表达模块的生物学意义。 阅读详情

相关推荐

CentOS 7/8 系统下,基于Docker Compose一键部署Dify AI应用平台

本文详细介绍了在CentOS 7/8系统下,使用Docker Compose一键部署Dify AI应用平台的完整流程。从系统环境准备、Docker引擎安装与加速配置,到获取Dify项目、关键环境变量设置,再到服务启动、状态监控及初始化访问,提供了手把手的部署指南和常见问题排查方法,帮助用户快速搭建稳定、可维护的AI应用开发环境。

q5r6s7的博客 139

力扣刷题笔记:找出字符串中第一个匹配项的下标(LeetCode28)—— Java

暴力解法虽然直观,但在大规模数据下效率较低。我会在后面的文章中介绍更高效的KMP算法,通过预处理模式串优化匹配过程,敬请期待!主包有点太啰嗦了,请原谅我哈哈。

2501_90563889的博客 980

深入浅出:用状态机搞定FPGA MIG控制器与DDR3的读写时序(附Verilog源码分析)

本文深入解析了如何利用状态机精准控制FPGA MIG控制器与DDR3的读写时序,涵盖Verilog源码实现、关键时序控制点及实战优化技巧。通过状态机设计、跨时钟域处理和带宽优化等方法,有效提升DDR3访问效率,适用于高性能计算和AI加速器等场景。

weixin_26899659的博客 408

力扣(leetcode)第28题找出字符串中第一个匹配项的下标(Python)

最后,我写了一篇MySQL教程,里面详细的介绍了MySQL的基本概念以及操作指令等内容,欢迎阅读!输入:haystack = “leetcode”, needle = “leeto”输入:haystack = “sadbutsad”, needle = “sad”解释:“leeto” 没有在 “leetcode” 中出现,所以返回 -1。字符串的第一个匹配项的下标(下标从 0 开始)。解释:“sad” 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0。仅由小写英文字符组成。

qq_58737789的博客 1389

全国各省份影像下载地址(11级别)

cesium中使用urltemplate加载,leaflet中使用tile加载,具体加载有问题可以给我留言。

资深三维GIS开发 5142

(04730)半导体器件之基本放大器工作原理(一)

放大器是构成各种电子线路的基本单元电路。所谓“放大”,就是将输入的微弱信号(微弱变化的电压或电流等)去控制直流电源提供的能量,并使输出按照输入的小信号变化规律而变化的过程。所以放大器的本质是能量转换器。本节重点学习基本放大电路的工作原理和基本分析方法及主要性能指标。

黄先生的博客 3005

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

字符串的第一个匹配项的下标(下标从 0 开始)。ok了,就到这里叭~~~

canGfly的博客 405

ECU-TEST笔记&使用技巧01

说明 1)所述均基于如下环境:ECU-TEST 8.0、Win10系统、NI Veristand 2018(HIL测试)。不排除因为版本及软件环境问题,所述方法不奏效或有更好的方法,欢迎交流,一起提高。 2)本博客以问答形式进行,所述问题均来自于实际测试(包括MIL、HIL测试)遇到的问题及需求,目的是提高测试效率和自动化测试序列的可维护性。 3)本博客尽量从测试方法及ECU-TEST原...

Eigrl的博客 1万+

LeetCode - 28 找出字符串中第一个匹配项的下标

因为前缀部分(如abc)和后缀部分(如abc)完全相同,而前缀部分(如abc)和中间部分(如d)不相同,因此前缀部分(如abc)和中间部分对齐(如d)时,必然匹配失败。本题如果采用暴力解法的话,可以定义两个指针 i,j,其中 i 指针用于扫描 S(haystack)串,j 指针用于扫描 T(needle)串。注意,判断前缀和后缀是否相同,都是从左往右逐一比对,因此上面例子中,长度为3的前缀"aab"和后缀"baa"是不相同的。"leeto" 没有在 "leetcode" 中出现,所以返回 -1。

优快云 1356

SQL面试题——最大连续登陆问题

最大连续登陆是我们计算比较常用的指标,我们可以将其当成一个经典的SQL模型,后面我们也会陆续总结出其他的模型,你还知道其他的比较经典的SQL 吗?欢迎分享,或者你还知道其他的关于计算连续的指标?最大连续登陆重要的是计算思想,最大连续才是关键,登陆只是一个场景,要学会举一反三。

9011

HFSS实战项目——GPS北斗双模微带天线

本文设计了一款方形圆极化微带天线应用于北斗B1和GPSL1频段,满足高增益、低VSWR、适当方向图等要求。设计中心频率为1568MHz,介质板采用厚度h=1.6mm的Arlon AD450(tm)板,相对介电常数为4.5,采用探针馈电。

2401_87464239的博客 1767

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

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。输入:haystack = “leetcode”, needle = “leeto”输入:haystack = “sadbutsad”, needle = “sad”解释:“leeto” 没有在 “leetcode” 中出现,所以返回 -1。解释:“sad” 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0。

m0_73841621的博客 683

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1532

LeetCode面试150——28找出字符串中第一个匹配项的下标

LeetCode面试150——28找出字符串中第一个匹配项的下标题目讲解和代码实现

Junmo12345的博客 1156

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

力扣刷题笔记:找出字符串中第一个匹配项的下标(LeetCode28)—— KMP 算法版

前缀表是针对needle(模式串)的,数组名叫nextnext[i]表示这个子串中,最长的相等前缀和后缀的长度。这里得先搞懂两个词:前缀:从开头开始的子串(不包含最后一个字符),比如 "ABC" 的前缀是 "A"、"AB"后缀:从结尾往前的子串(不包含第一个字符),比如 "ABC" 的后缀是 "C"、"BC"next[0]:子串 "A",没有前缀和后缀,所以 0next[1]:子串 "AB",前缀 "A" 和后缀 "B" 不相等,所以 0next[2]

2501_90563889的博客 1027

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

yyh520025的博客 1062

[LeetCode力扣] 28-找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。输入:haystack = “leetcode”, needle = “leeto”输入:haystack = “sadbutsad”, needle = “sad”解释:“leeto” 没有在 “leetcode” 中出现,所以返回 -1。解释:“sad” 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0。

m0_61900513的博客 350

力扣解题-28. 找出字符串中第一个匹配项的下标

内置方法法:工程开发首选,代码极简且性能优异,依赖JDK优化实现;暴力匹配法:逻辑直观,适合理解字符串匹配核心原理,但最坏时间复杂度O(n×m),大数据量下性能差;KMP算法:字符串匹配的最优解,时间复杂度O(n+m),通过next数组避免重复比对,是面试核心考点;关键技巧:处理边界条件(空模式串返回0);KMP算法的核心是next数组的生成,理解“最长相等前后缀”是掌握KMP的关键;暴力匹配可通过“剪枝”(遍历到n-m为止)减少无效操作。

qq_38261626的博客 649

Leetcode28. 找出字符串中第一个匹配项的下标

算法路上的第一个大boss之kmp

Ishihara_Satomi的博客 668

力扣28题-找出字符串中第一个匹配项的下标

力扣28题-找出字符串中第一个匹配项的下标

m0_65818274的博客 390

[Leetcode] 28. 找出字符串中第一个匹配项的下标

的最长相等前后缀的强度,因为数组从0开始的,那么这个长度的值就是我们下一个要匹配的那一位。不匹配时,因为前面我们已经匹配过了,那么就回到。为结尾的最长前后缀相等的长度。我们使用的方法是0开始的。主要应用在字符串匹配上。这里就不详细赘述了,

qq_37408470的博客 211

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

"leeto" 没有在 "leetcode" 中出现,所以返回 -1。字符串的第一个匹配项的下标(下标从 0 开始)。这个没啥特别解释的,代码的含义都使用注释标记了。第一个匹配项的下标是 0 ,所以返回 0。"sad" 在下标 0 和 6 处匹配。

bwj_2002的博客 278

【leetcode】28. 找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。输入:haystack = “leetcode”, needle = “leeto”输入:haystack = “sadbutsad”, needle = “sad”解释:“leeto” 没有在 “leetcode” 中出现,所以返回 -1。解释:“sad” 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0。

qq_38473254的博客 365

28.力扣LeetCode_找出字符串中第一个匹配项的下标

本文介绍了三种字符串匹配算法:朴素模式匹配、KMP算法及其优化版本。朴素算法通过双指针暴力匹配,时间复杂度O(n*m);KMP算法利用next数组存储模式串的前后缀信息,避免主串回溯,优化至O(n+m);优化版KMP进一步改进next数组为nextVal,规避重复回溯。文章详细解析了各算法的实现逻辑,包括关键的双指针策略、回溯机制以及next数组的构建与优化方法,并提供了完整的带注释代码实现,展示了如何逐步提升模式匹配效率。

2401_82472941的博客 874

Leetcode.28 找出字符串中第一个匹配项的下标(完整代码)

Leetcode.28 找出字符串中第一个匹配项的下标(完整代码)

weixin_43602756的博客 905

LeetCode 28 找出字符串中第一个匹配项的下标

本文分析了LeetCode字符串匹配问题的暴力解法及优化方案。题目要求在haystack中找出needle首次出现的下标,不存在则返回-1。给出的初始代码存在数组越界风险(未限制内层循环范围)和冗余变量问题。修正版规范代码通过设置外层循环上限为n-m避免越界,使用bool变量提升可读性,时间复杂度O(n*m)。文章还对比了KMP算法(O(n+m))和库函数实现,指出暴力解法适合入门但需注意:1)主串剩余长度检查;2)减少无用变量;3)循环剪枝优化。最后总结了常见易错点,强调边界条件的重要性。

2301_80252792的博客 201

力扣28.找出字符串中第一个匹配项的下标

"leeto" 没有在 "leetcode" 中出现,所以返回 -1。字符串的第一个匹配项的下标(下标从 0 开始)。第一个匹配项的下标是 0 ,所以返回 0。"sad" 在下标 0 和 6 处匹配。

2502_90980100的博客 328
上一篇: 「力扣」27. 移除元素
下一篇: 【数据结构与算法】字符串匹配 - 暴力算法
「已注销」
博客等级 码龄3年 128粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值