java数据结构与算法刷题-----LeetCode28. 找出字符串中第一个匹配项的下标

代码随想录算法训练营第八天|字符串part02(KMP算法的应用) 2.处理前后缀不相同的情况:i从1开始,进行s[i]和s[j](j从0开始)或s[i]和s[j+1](j从-1开始)比较,不相同,也就是前后缀末尾不相同的话就要向前回退,j回退到next[j-1](j从0开始)或next[j](j从-1开始)。因为s[0]=t[0]=k[0]=s[3],s[1]=t[1]=k[1]=s[4],s[2]=t[2]=k[2]=s[5],所以s[0-2]=s[3-5];以此类推,得到字符串s[0-1]=s[2-3]=s[4-5]=s[6-7],所以s[0-1]是最小重复子串。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

解题思路

暴力解法,和KMP算法

KMP算法https://blog.youkuaiyun.com/grd_java/article/details/136107363
代码

暴力解法代码
在这里插入图片描述

class Solution {
    /**
        暴力解法O(m*n)
        依次遍历进行匹配
        hello 和 ll匹配
        he 匹配 ll
        el 匹配 ll
        ll 匹配 ll 成功,返回结果
     */
    public int strStr(String haystack, String needle) {
        int ans = -1;
        loop:for (int i = 0; i < haystack.length();) {
            int index = 0;
            while(i+index<haystack.length()&&index<needle.length()){
                if(haystack.charAt(i+index)!=needle.charAt(index)){
                    i++;
                    continue loop;
                }
                index++;
            }
            if(index==needle.length()){
                ans = i;break ;
            }
            i++;
        }
        return ans;
    }
}
  1. KMP解法代码
    在这里插入图片描述
class Solution {
     public int strStr(String haystack, String needle) {
        int n = haystack.length(),m = needle.length();//为了更快的速度
         if(m==0) return 0;
        //1、kmp数组
        int[] kmpArr = new int[m];
        kmpArr[0] = 0;
        for (int i = 1,j = 0; i < m; i++) {
            //"ABCDABD"
            //"i***i"两个i对应的匹配成功,那么匹配成功长度+1,j++,长度为1。说明如果匹配到ABCDA,那么下次可以把ABCD跳过,末尾的A不可以跳过
            //" i***i"然后两个i位置又成功,j++,长度为2,也就是说匹配到了ABCDAB,下次ABCD可以跳过,末尾的AB不可以,因为重复了
            //最后,j = 2,i = 6,C不匹配D
            //j = kmp[j-1] 看看后移后的缀匹配程度,一直到匹配成功,或者j = 0,从开头重新匹配
            while(j>0 && needle.charAt(i)!=needle.charAt(j)) j = kmpArr[j-1];
            if(needle.charAt(i)==needle.charAt(j)) j++;//匹配成功,j长度+1
            kmpArr[i] = j;
        }
        //2、用kmp数组
        for (int i = 0,j = 0; i < n; i++) {
            //这里和上面代码一样,只不过原来是needle自己比,现在是haystack和needle比较
            while(j>0 && haystack.charAt(i)!=needle.charAt(j)) j = kmpArr[j-1];
            if(haystack.charAt(i)==needle.charAt(j)) j++;//匹配成功,j长度+1
            if(j==m) return i-j + 1;//匹配成功
        }
        return -1;//没成功
    }
}

刷题一定要坚持,总结套路,不单单要把题做出来,要举一反三,也要参考别人的思路,学习别人解题的优点,找出你觉得可以优化的点。

  1. 单链表解题思路:双指针、快慢指针、反转链表、预先指针
  1. 双指针:对于单链表而言,可以方便的让我们遍历结点,并做一些额外的事
  2. 快慢指针:常用于找链表中点,找循环链表的循环点,一般快指针每次移动两个结点,慢指针每次移动一个结点。
  3. 反转链表:通常有些题,将链表反转后会更好做,一般选用三指针迭代法,递归的空间复杂度有点高
  4. 预先指针:常用于找结点,比如找倒数第3个结点,那么定义两个指针,第一个指针先移动3个结点,然后两个指针一起遍历,当第一个指针遍历完成,第二个指针指向的结点就是要找的结点
  1. 数组解题思路:双指针、三指针,下标标记
  1. 双指针:多用于减少时间复杂度,快速遍历数组
  2. 三指针:多用于二分查找,分为中间指针,左和右指针
  3. 下标标记:常用于在数组范围内找东西,而不想使用额外的空间的情况,比如找数组长度为n,元素取值范围为[1,n]的数组中没有出现的数字,遍历每个元素,然后将对应下标位置的元素变为负数或者超出[1,n]范围的正数,最后没有发生变化的元素,就是缺少的值。
  4. 差分数组:对差分数组求前缀和即可得到原数组
  1. 用差值,作为下标,节省空间找东西。比如1900年到2000年,就可以定义100大小的数组,每个数组元素下标的查找为1900。
  2. 前缀和数组,对于数组 [1,2,2,4],其差分数组为 [1,1,0,2],差分数组的第 ii个数即为原数组的第 i-1 个元素和第 i个元素的差值,也就是说我们对差分数组求前缀和即可得到原数组
  1. 前缀和:假设有一个数组arr[1,2,3,4]。然后创建一个前缀和数组sum,记录从开头到每个元素区间的和。第一个元素是0。第二个元素,保存第一个和sum[1] = sum[0]+arr[0],第二个元素,保存第二个和sum[2] = sum[1]+arr[1]
  1. 栈解题思路:倒着入栈,双栈
  1. 倒着入栈:适用于出栈时想让输出是正序的情况。比如字符串’abc’,如果倒着入栈,那么栈中元素是(c,b,a)。栈是先进后出,此时出栈,结果为abc。
  2. 双栈:适用于实现队列的先入先出效果。一个栈负责输入,另一个栈负责输出。
CAN收发器选型避坑指南:TJA1051T与TJA1051T/3的硬件兼容性问题实录 本文详细解析了CAN收发器TJA1051T与TJA1051T/3的硬件兼容性问题,通过实测数据和故障案例揭示了VIO引脚的关键差异及其对系统的影响。提供从选型到验证的完整防坑方案,帮助开发者避免常见设计错误,确保CAN总线通信的稳定性。 阅读详情

相关推荐

Zenoh:统一数据平面协议,重塑物联网与边缘计算架构

在分布式系统与物联网领域,数据通信与处理常面临协议割裂的挑战。传统方案如MQTT、Kafka、gRPC等,分别针对发布/订阅、流处理和RPC等不同场景,导致架构复杂、集成成本高。其核心问题在于未能统一处理“运动中数据”(Data in Motion)与“静止中数据”(Data at Rest)。Zenoh协议通过创新的“Key-Value”寻址与“Selector”查询语言,将发布/订阅、存储、查询和计算四种核心操作融合进单一协议,构建了统一的抽象层。这种设计实现了极低的协议开销(仅5字节头部)和地理分布式

weixin_29597551的博客 291

【经典算法】LeetCode28 找出字符串中第一个匹配项的下标(Java/C/Python3实现含注释说明,Easy)

方式优点缺点时间复杂度空间复杂度朴素字符串匹配实现简单效率低,当模式串与母串不匹配时,需要多次比较O(1)KMP算法效率较高,通过预处理减少不必要的比较实现相对复杂O(N+M)O(M)标准库函数(如简洁易用,性能通常经过优化依赖外部库,可能不是最灵活的选择取决于实现取决于实现。

1593

C#实战:基于ONNX与SCRFD/ArcFace的高效人脸识别系统开发

本文详细介绍了如何在C#环境中,利用ONNX Runtime高效部署SCRFD人脸检测与ArcFace人脸识别模型,构建一个完整的、高性能的人脸识别系统。内容涵盖环境搭建、模型推理、人脸对齐、特征提取等核心模块,并提供了从Demo到生产系统的优化思路与实战代码,为.NET开发者提供了一套开箱即用的解决方案。

weixin_29061821的博客 488

LeetCode题解java算法: 28. 实现 strStr()

实现 strStr() 函数。 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。 说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。 示例 1: 输入:haystack = "hel

wh1236666的博客 196

Lisflood

文献:基于SWMM和LISFLOOD-FP模型的居住区低影响开发模拟评价。问题:多个节点溢流同时,不行,待解决。目录下,cmd命令行。

警警的博客 2664

Abaqus SIGTERM/SIGINT中断问题深度解析与实战解决方案

本文深度解析Abaqus仿真计算中因SIGTERM或SIGINT信号导致作业意外终止的常见问题。核心原因常为许可证管理器因网络通信延迟误判进程空闲而强制断开,或系统资源监控工具的误杀。文章提供了从命令行参数调优(如使用int、ask_delete=OFF)、计算环境隔离到编写自动化容错脚本的完整实战解决方案,帮助用户彻底规避此类中断,确保长时间仿真任务的稳定运行。

weixin_29279101的博客 415

刷题笔记:LeetCode28-KMP模式匹配算法拾遗(Java)

先上题目。

m0_53190754的博客 1057

AI驱动的iOS逆向工程自动化:14阶段工作流与Ghidra集成实践

逆向工程是软件安全分析的核心技术,通过反汇编、调试等手段解析程序内部逻辑与数据流。其原理在于将编译后的二进制代码还原为可理解的逻辑结构,从而发现潜在漏洞或理解软件行为。在移动安全领域,iOS逆向工程具有重要技术价值,能够用于安全审计、漏洞挖掘与恶意软件分析。传统iOS逆向依赖ipsw、class-dump、Frida等工具链组合,存在学习曲线陡峭与流程碎片化问题。本文介绍的ios-reverse-skills项目创新性地将14阶段逆向工程方法论封装为AI可调用的标准化脚本集,通过Ghidra脚本实现Swif

weixin_27268733的博客 436

leetcode算法28,2024年最新java高级程序员面试笔试

一、leetcode算法1、实现strStr()

m0_60607371的博客 386

SAP产品合规(Product Compliance)管理—规格主数据 CG02/CG02WB

SAP产品合规(Product Compliance)管理—规格主数据概览 CG02/CG02WB

Lucas1211的博客 1431

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)

本文借助easyx库函数(提供下载链接),很方便地用C语言实现了鼠标、按钮、进度条、坐标尺等操作,为普通C程序的友好人机交互界面提供了一种简单便捷的方案。

体会编程语言独到的美 17万+

LeetCode-28-java

边界条件: 1.当标准数组为0 的时候返回0 2.当主数组长度小于标准数组长度的时候返回-1 3.当主数组与标准数组比较的时候注意主数组剩余队列的长度 class Solution { public int strStr(String haystack, String needle) { if (needle.length() == 0) return 0; // System.out.printl...

wdgmf123的博客 209

HQChart实战教程64-自定义分时图标题栏

分时图标题栏显示的是当前十字光标所在位置的分钟信息,显示在分时图窗口顶部。一般会显示品种的名称,日期,时间,价格,均价 涨幅,成交量,金额等等,hqchart内置会显示这些信息。如果要额外显示其他的字段,就需要通过替换格式化标题输出函数来是现实。我们在hqchart实例创建完成以后,通过OnCreatedCallback回调函数替换自己的格式化输出函数。返回 { AryText:[ { Text:文字, Color:颜色},…入参 data={ Data: 当前十字光标所在位置的分钟线 }

小银 1057

LeetCode题练习与总结:找出字符串中第一个匹配项的下标

在本文中,我们探讨了如何在字符串 `haystack` 中查找子字符串 `needle` 的第一个匹配项。首先,我们介绍了暴力搜索方法,它通过逐个字符比较来实现,具有 O(m * n) 的时间复杂度。然后,我们详细讨论了更高效的 Boyer-Moore 算法,它利用坏字符表和好后缀表来跳过不可能匹配的字符,平均时间复杂度为 O(m + n)。我们还分析了这两种方法的时间复杂度和空间复杂度,并总结了实现这两种算法的关键知识点。

一直学习永不止步 1341

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

刷题计划day9 字符串 下【KMP再续】【找出字符串中第一个匹配项的下标】【重复的子字符串】

刷题计划day9继续,字符串下,KMP再续,加油加油,下期开启新专题

weixin_72499901的博客 988

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

luoyepiaoxue2014的博客 619

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【KMP算法】KMP算法揭秘:高效字符串匹配的艺术

KMP算法的讲解及应用

2403_87459748的博客 1619

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

KMP 的详细实现可以在需要优化效率的情况下考虑。它的核心是通过构建部分匹配表来减少不必要的重复匹配,使得时间复杂度能达到 O(n)。KMP(Knuth-Morris-Pratt)算法通过提前计算出匹配失败时应该从哪里继续匹配,避免重复的匹配过程。字符串的第一个匹配项的下标(下标从 0 开始)。字符串的第一个出现位置。KMP 方法的时间复杂度为。方法一:暴力匹配实现。

weixin_61695887的博客 1008

LeetCode:28. 找出字符串中第一个匹配项的下标(KMP算法)

LeetCode:28. 找出字符串中第一个匹配项的下标(KMP算法)

xiaoshiguang3的博客 434

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

KMP算法以及一些注意点

yun_shui_的博客 688

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

时间复杂度O(mn),空间复杂福挺简单的,没啥要总结的。时间复杂度O(m+n),KMP算法太强了,有时间我一定要专门开个帖子讲讲我对KMP的理解。(开个超级大坑)KMP简直太神了,巧夺天工。ps:第一次知道if后面还要+空格(标准化)。

2201_75433472的博客 307

【代码随想录】刷题笔记——字符串篇

本文总结了字符串反转和匹配的常见算法实现。主要包括:1)344题双指针反转字符串;2)541题分段反转字符串(每2k字符反转前k个);3)151题反转字符串中的单词顺序;4)28题字符串匹配(朴素算法);5)459题判断重复子字符串的巧妙解法。关键技巧包括双指针、分段处理、字符串拼接等,并介绍了StringBuilder、trim()等常用API。这些算法体现了字符串处理的基本思路,如指针操作、模式匹配等,是解决更复杂字符串问题的基础。

gadiaola的博客 633

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

本文介绍了两种实现找出字符串中第一个匹配项的下标的方法:方法一通过遍历主字符串并截取子串进行比较;方法二直接调用String类的indexOf()方法。文章还总结了Java字符串操作的关键点:length属性与length()方法;substring();equals()与”==“;indexOf()。这些知识点对理解字符串处理有重要帮助。

weixin_60472311的博客 205

怒刷LeetCode的第12天(Java版)

第一题题目来源解决方法方法一:贪心这段代码是使用贪心思路实现的,计算分配钱币给儿童的最多个数。LeetCode运行结果:第二题题目来源解决方法方法一:双指针需要注意的是,虽然上述代码的时间复杂度与 needle 的长度 n 相关,但由于 n 的取值范围很小(1

m0_74293254的博客 392

Java【数据结构入门OJ题33道】——力扣刷题记录1

记录力扣数据结构入门OJ题33道。

yzhcjl_的博客 1900

LeetCode刷题笔记-数据结构-day14

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

2401_83916283的博客 747
上一篇: java数据结构与算法刷题-----LeetCode27:移除元素
下一篇: MySQL 数据存储和优化------主目录 ----(架构---索引---事务---锁---集群---性能---分库分表---实战---运维) 持续更新
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值