LeetCode:28. 找出字符串中第一个匹配项的下标 ——【1、理解 KMP 算法】

news2025/4/4 21:48:52
🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123

目录

  • 一、🌱[28. 找出字符串中第一个匹配项的下标](https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/)
    • 🌴解题
      • 1.暴力法
        • code:
      • 2.模式串匹配
        • KMP 算法
        • code:


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

  • 题目描述:给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
  • 来源:力扣(LeetCode)
  • 难度:中等
  • 提示:
    1 <= haystack.length, needle.length <= 104
    haystackneedle 仅由小写英文字符组成

🌴解题

1.暴力法

暴力法只需要判断字符串 A 的子字符串目标字符串 needle 是不是相等即可;
i 遍历与目标字符串等长A 的子字符串haystack.substring(i,i+needle.length()) ==needle
注意到,这个遍历并不需要到字符串 A 的结尾,因为匹配长度的原因,遍历区间是 [0,haystack.length()-needle.length()]。

code:

class Solution {
    public int strStr(String haystack, String needle) {
        int ans=-1;
        for (int i = 0; i <= haystack.length()-needle.length(); i++) {
            if(haystack.substring(i,i+needle.length()).equals(needle)){
                return i;
            }
        }
        return ans;
    }
}

在这里插入图片描述

2.模式串匹配

KMP 算法

在前面使用暴力法匹配的时候是浪费了很多的匹配次数,就是指有一部分内容可以略过,不用从头开始:
在这里插入图片描述
例如上图中,遍历到第 7 个字符匹配 (b - c) 的时候,发现是不匹配的。按常规方法来说又得从字符串 A 第 2 个字符目标第一个字符开始往后面遍历,而实际上在 a b a 这一段开始的匹配是做的无用功,而有用的就是 (b - c) 前面匹配过的 a a
字符串 A 中的b前面的 a a(红框里)可以匹配上目标最前面的 a a ,字符串A的遍历就不必要回头,只有目标要返回;
例如下图:
在这里插入图片描述

即:找到目标串最前面和最后面相同的字串,这一部分不用重复,是已经验证过的。

有了前面的理解,我们就可以更好理解 KMP 算法了。
KMP 中的模式串就是目标字符串,而模式串(目标)如何回头——使用 next 数组,或说前缀表,来确定模式串的指针回到哪个位置。

前缀表就是记录一个最长公共前后缀,
前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;
后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串;
就是前缀==后缀的一个长度。

例如对于这个模式(目标)串,最长公共前后缀:
在这里插入图片描述

对于a:没有最长公共前后缀——0;
对于aa:第一个a和最后一个a——1;
对于aab:第一个a和最后一个b,不匹配——0;
对于aaba:第一个a和最后一个a——1;
对于aabaa:前面的aa和最后的aa——2,注意aab和baa、aaba和abaa不是相等的

那我们理解了这个概念,又如何用代码实现求 next 数组呢?

int[] next=new int[needle.length()];
int j=0;
next[j]=0;
for (int i = 1; i < needle.length(); i++) {
    while(j>0&&needle.charAt(j)!=needle.charAt(i)){
        j=next[j-1];
    }
    if(needle.charAt(j)==needle.charAt(i)){
        j++;
    }
    next[i]=j;
}

求 next 数组演示图:
在这里插入图片描述
根据 next 数组模式匹配:
在这里插入图片描述

code:

class Solution {
    public int strStr(String haystack, String needle) {
        int ans=-1;
        //计算前缀和next数组
        int[] next=new int[needle.length()];
        int j=0;
        next[j]=0;
        for (int i = 1; i < needle.length(); i++) {
            while(j>0&&needle.charAt(j)!=needle.charAt(i)){
                j=next[j-1];
            }
            if(needle.charAt(j)==needle.charAt(i)){
                j++;
            }
            next[i]=j;
        }

        //匹配
        j=0;
        for (int i = 0; i < haystack.length(); i++) {
            if(j< needle.length()) {
                if (haystack.charAt(i) == needle.charAt(j)) {
                    j++;
                } else if(j>0){
                    j = next[j - 1];
                    i--;
                }
            }
            if(j== needle.length()){
                ans=i-needle.length()+1;
                break;
            }
        }

        return ans;

    }
}

在这里插入图片描述


返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓

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

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

相关文章

synchronized 的 monitor 机制

synchronized 的 monitor 机制 前言 本文基于 jdk 8 编写。author JellyfishMIX - github / blog.jellyfishmix.comLICENSE GPL-2.0 monitor monitor 是 synchronized 中用以实现线程之间的互斥与协作的主要手段&#xff0c;它可以看成是对象或者 class 持有的锁。每一个对象…

十六、市场活动:查看市场活动明细(一)

功能需求 点击市场活动名称链接,跳转到明细页面,查看市场活动明细 -市场活动的基本信息 -市场活动下所有的备注信息 功能分析 流程图 代码实现 一、ActivityMapper 1.ActivityMapper接口 /*** 点击名称&#xff0c;查看市场详细*/Activity selectActivityForDetailById(Stri…

相量的加减乘除计算

相量的加减乘除计算 矢量是物理学中的术语&#xff0c;是指具有大小&#xff08;magnitude&#xff09;和方向的量。如速度、加速度、力等等就是这样的量。向量是数学中的术语&#xff0c;也称为欧几里得向量、几何向量、矢量。与向量对应的量叫做数量&#xff0c;在物理学中称…

二叉树基础概念

1.二叉树种类 1.1 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为 0 0 0 的结点和度为 2 2 2 的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 如图所示&#xff1a; 这棵二叉树为满二叉树&#xff0c;也可以说深度为 k k k&…

自动驾驶企业面临哪些数据安全挑战?

近期&#xff0c;“特斯拉员工被曝私下分享用户隐私”不可避免地成了新闻热点&#xff0c;据说连马斯克也不能幸免。 据相关媒体报道&#xff0c;9名前特斯拉员工爆料在2019年至2022年期间&#xff0c;特斯拉员工通过内部消息系统私下分享了一些车主车载摄像头记录的隐私视频和…

JVM|为对象分配内存空间的流程

1. Eden是否能装下新对象&#xff1f; 1.1 如果可以&#xff0c;则装入新对象&#xff1b; 1.2 如果不可以&#xff0c;则发动minor gc&#xff1b; 2. minor gc后Eden空间是否能装下新对象&#xff1f; 2.1 如果可以&#xff0c;装入新对象&#xff1b; 2.2 如果不可以&#…

长安链引入全新身份认证体系IBC:突破公钥不可理解的限制

近日&#xff0c;未来区块链与隐私计算高精尖创新中心研究团队为长安链带来了一套基于国密SM9算法的全新标识身份认证体系IBC&#xff08;Identity-Based Cryptography&#xff09;。该项成果融合标识密码和现代身份管理体系&#xff0c;打破区块链数字身份监管难、管理难、联通…

优维低代码:第三方接口接入

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 连载…

淌入客户市场的“深水区”,锐捷云桌面体验再升级

作者 | 曾响铃 文 | 响铃说 现阶段&#xff0c;云桌面的普惠价值随着行业应用的深化正在不断突显。 以教育为例&#xff0c;教育信息化建设已经跨过了从无到有的阶段&#xff0c;目前正面临着如何降本增效的问题。云桌面的应用&#xff0c;正在有效地解决这个问题。 在响铃…

Java基础:数据类型会考什么?

本文列举一些关于Java基础的数据类型相关考点,方便以后复习查看 Java 中的哪几种基本数据类型了解么&#xff1f;它们的默认值和占用空间大小知道不? 说说这八种数据类型对应的包装类型 基本类型和包装类型的区别&#xff1f; int 和 Integer 的区别 为什么要有包装类型 ? …

Parallels Desktop for Mac 适用于苹果 macOS 的 PD 虚拟机(安装使用详细教程)

简介 Parallels Desktop for Mac 是一款适用于苹果 macOS 操作系统的虚拟机软件&#xff0c;可以让用户在 Mac 上运行 Windows、Linux 等其他操作系统&#xff0c;同时也可以在虚拟机中安装其他软件和应用程序。Parallels Desktop for Mac 还提供了许多实用的功能&#xff0c;…

窗口看门狗(WWDG)实验

窗口看门狗 窗口看门狗&#xff08;WWDG &#xff09;通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。 除非递减计数器的值在 T6 位&#xff08; WWDG -->CR 的第六位&#xff09;变成 0 前被刷新&#xff0c;看门狗电路…

ROS小乌龟话题改写--话题发布--话题订阅

创建小乌龟 roscore rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key2&#xff1a;图显示&#xff1a; rqt_graphtest02_sub_pose 3&#xff1a;通过命令显示话题名消息信息 方法一获得&#xff1a; rostopic info /turtle1/cmd_vel方法二获得&#…

Linux 提权学习

提权的目的是获取 root 权限 root 权限可获取 shadow 文件中的密码 Hash&#xff0c;若内网环境中存在「账户/密码复用」的情况&#xff0c;可用于横向扩展 暴力破解 suid 提权 内核漏洞提权 定时任务提权 sudo 提权 第三方服务提权&#xff08;docker、mysql、redis、NFS提权…

量子退火Python实战(4):PyQUBO使用攻略 MathorCup2023加油!

文章目录 前言一、约束部分的QUBO怎么求&#xff1f;二、PyQUBO的输出结果怎么不是QUBO矩阵&#xff1f;三、我的建模太复杂了&#xff0c;可以不用PyQUBO吗&#xff1f;四、怎么构建sum&#xff08;x_1...x_i&#xff09; K的约束&#xff1f;总结 前言 提示&#xff1a;本教…

3DEXPERIENCE MODSIM产品前期概念结构快速开发方案(上) | 达索系统百世慧®

基于3DEXPERIENCE单一数据源、实时多专业协同平台&#xff1b;传统CATIA建模附加全新CATIA柔性快速建模技术&#xff1b;CATIA原生概念建模仿真一体化模型&#xff1b;一模两用&#xff0c;快速建模与变更、多学科快速验证与自动优化、支持快速概念方案决策&#xff1b;仿真效率…

快手社招Java后端开发岗面试,被问麻了

社招面试是基于你的工作项目来展开问的&#xff0c;比如你项目用了 xxx 技术&#xff0c;那么面试就会追问你项目是怎么用 xxx 技术的&#xff0c;遇到什么难点和挑战&#xff0c;然后再考察一下这个 xxx 技术的原理。 今天就分享一位快手社招面经&#xff0c;岗位是后端开发&…

日常记录:天梯赛练习集L1-044 稳赢

题目&#xff1a; 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个稳赢不输的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但是&#xff01;为了不让对方输得太惨&#xff0c;你需…

软件测试能干多久?测试员能干到多大年龄?

测试员可以工作多少年?大多数人认为软件测试是吃青春饭的工作。只能干到30岁&#xff0c;最长可达35岁。我经常听到这样的话&#xff0c;都让人倍感压力。今天&#xff0c;我们来谈谈这个老话题… 软件测试能干多久&#xff1f; 软件测试并没有明确的职业寿命限制&#xff…

【高项】项目的概念,项目管理基础与立项管理

【高项】项目的概念&#xff0c;项目管理基础与立项管理 文章目录1、什么是项目&#xff1f;项目的概念2、项目管理知识体系2.1 组织结构对项目的影响2.2 信息系统项目的生命周期2.3 单个项目的管理过程3、立项管理3.1 熟悉立项的流程&#xff08;申请书->可行性->评估-&…