【KMP算法最详细讲解】28. 实现 strStr()

news2024/11/24 18:46:47

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2

示例 2: 输入: haystack = "aaaaa", needle = "bba" 输出: -1

说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

思路:KMP算法

KMP的经典思想就是: 当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。

next数组:前缀表:记录下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。

前缀表是用来回退的,它记录了当模式串与主串不匹配的时候,模式串应该从哪里和主串重新匹配。

前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串

后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串

举个例子:

比如:

模式串:aabaabaaf

字符串:aabaaf

前面匹配了aabaab和aabaaf,发现最后一位不匹配,这个时候,我们知道,前一位也就是aabaa的最后一个a,它对应数字2,就是说最后两个单位长度的后缀,是和它的前缀一样的。所以我们只需要从aabaa的倒数第二个元素对应的原字符串的位置重新开始找。

相当于是,我们发现f这个位置不匹配了,但我们之前f前面的aa,和子串的前两位aa,是一样的,所以子串从它后两位aa对应的长串的位置,重新看aa后面的b与长串aa的后面是不是对应就可以了。

时间复杂度分析:

其中n为文本串长度,m为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出匹配的过程是O(n),之前还要单独生成next数组,时间复杂度是O(m)。所以整个KMP算法的时间复杂度是O(n+m)的。

暴力的解法显而易见是O(n × m),所以KMP在字符串匹配中极大地提高了搜索的效率。

生成next数组的过程讲解:

 

class Solution:
    def getNext(self, next, s):
        j=-1
        next[0] = j
        for i in range(1, len(s)):
            while j>=0 and s[i] != s[j+1]:
                j=next[j]
            if s[i] == s[j+1]:
                j += 1
            next[i] = j


    def strStr(self, haystack: str, needle: str) -> int:
        if not needle:
            return 0
        next = [0] * len(needle)
        self.getNext(next, needle)
        j = -1
        for i in range(len(haystack)):
            while j >= 0 and haystack[i] != needle[j+1]:
                j = next[j]
            if haystack[i] == needle[j+1]:
                j += 1
            if j == len(needle) - 1:
                return i-len(needle)+1
        return -1

这道题还挺难的。以后还需要时常复习和思考。

5月13日 重写:
 

class Solution:
    def getNext(self, next, s):
        j=-1
        next[0]=j
        for i in range(1,len(s)):
            while j>=0 and s[i]!=s[j+1]:
                j=next[j]
            if s[i]==s[j+1]:
                j+=1
            next[j] = j
        
        
    def strStr(self, haystack: str, needle: str) -> int:
        j=-1
        next=[0]*len(needle)
        nd = self.getNext(next,needle)
        for i in range(1,len(nd)):
            while j>=0 and haystack[i]!=needle[j+1]:
                j=nd[j]
            if haystack[i]==needle[j+1]:
                j+=1

错误点:

在得到next数组的时候,是next[i]=j,而不是next[j]=j

j只是一个暂时的变量,如果不相等,j就回退,如果相等,j就加1,并且让next[i]=j

在寻找needle的时候:

先检查needle是不是为空,如果是,就返回0(在haystack的开头就是空)

不需要让nd=self.getNext(next, needle),因为getNext这个函数传入了next这个list,并且改变了这个list,使得里面有数值,不需要再让另一个list等于它了。

在得到next数组的时候,i从1开始,因为next[0]已经等于j。

但是,在遍历haystack的时候,i从0开始。

判断最后是否在haystack中找到了needle:if j==len(needle)-1

【其实这个点我想到了,但是不知道对不对,所以没有写。看来以后要自信大胆写。】

(因为这个next数组是-1版本的,所以判断条件是j==len(needle)-1)

i指向的是haystack对应的,needle末尾的位置,所以return i-len(needle)+1, 就是needle头出现在haystack的位置了。

如果直到i遍历完,都没有进入这个if,那么就跳出for loop, return -1

注意:

第二个function中,是for i in range(len(haystack)), 而不是for i in range(len(needle))

里面的判断,if statement, 是 haystack[i]和needle[j+1]比较, 而不是haystack[i]和needle[j+1]比较。注意!

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

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

相关文章

《三》菜单栏_工具栏_状态栏动作与实现

上期我们创建了辣么多的动作,那么这次我们要是开始实现这些动作,撸起袖子来吧: //菜单动作(ACtion)QAction *newAct;//新建QAction *openAct;//打开QAction *saveAct;//保存QAction *saveAsAct;//另存为QAction *prin…

高铁列车班组信息宣传投稿我喜欢上了这个好方法

作为高铁列车班组的一名工作人员,我肩负着对外信息宣传的重任。随着高铁列车的快速发展,我们班组不仅需要提供优质的服务,还需要通过媒体向外界传递我们的声音,展示我们的风采。然而,在投稿的过程中,我经历了一段充满挑战和困惑的时光。 起初,我采用传统的邮箱投稿方式,将精心撰…

TS的快速入门(HarmonyOS学习第一课)

快速入门 学习TypeScript 对于Harmony0s,应用开发至关重要。在Harmonyos 中,主力编程语言为 ArKTS,它是基于 TypeScript 的一种语言,其通过与ArkUI 框架的匹配,拓展了声明式UI和状态管理等能力,使开发者能够以更简洁自…

BMS-HiL系统方案设计

系统集成了业内著名 NI 公司的软硬件平台。 系统设计采用分布式设计模式。主控上位机作为整个实验的管理者主要设计软件交互和 流程管理的业务;下位机主要业务为序列执行与设备调用,各模块详细测试方案如下所示。 系统搭建使用 PXI 系统技术,…

【命名空间】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 学校的人事部门保存了有关学生的部分数据(学号、姓名、年龄、住址),教务部门也保存了学生的另外一些部分数据(学号、姓名、性别、成绩),两个部门分别编写了本部门的数据管…

OS复习笔记ch5-4-2

引言 承接上文我们介绍了信号量机制和应用信号量机制实现的进程同步和互斥,这一节我们将围绕一些经典问题对信号量机制展开更深入地探讨。 读者/写者问题 读者/写者问题与我们之前遇到的问题类型不同,它描述的是: 有读者和写者两组进程&am…

分布式版本控制工具git

1 安装Git 在linux上我们建议你用二进制的方式来安装git,可以使用发行版包含的基础软件包管理工具来安装,如果你是 是CentOS或者Fedora的操作系统,可以使用yum命令来安装git: $ sudo yum install git如果你是ubuntu或者是Debian…

语音识别-paddlespeech-流程梳理

上一次研究语音识别是21年年底的事情了,记得当时是先进行了语音识别的应用,然后操作了模型的再次训练;两年过去,关于ASR相关流程忘得差不多了,这次基于paddlespeech的代码,进行了流程的梳理,关于…

从零创建一个vue2项目

标题从零创建一个vue2项目,项目中使用TensorFlow.js识别手写文字 npm切换到淘宝镜像 npm config set registry https://registry.npm.taobao.org安装vue/cli -g npm install -g vue/cli检查是否安装成功 vue -V创建项目 vue create 项目名安装TensorFlow npm …

AI试衣IDM-VTON,Windows11本地安装配置记录!

昨天我们已经介绍过IDM-VTON这个开源项目了。 通过这个软件可以轻松实现一键换衣服。 昨天,简单演示了一下在线使用。 今天,来演示如何安装到本地电脑上! 本地配置会有一定的专业性,懂的人可以参考下。 不懂得直接拉到最后&am…

绘制一个单级放大电路原理图过程,保姆级教程

新手在学习pads的使用最好最快的方法就是实际上手去画原理图,画PCB图,在这个过程中,就能够更快速得掌握PADS软件的使用。 本篇就是对于实际画原理图过程的一个记录,手把手教学,如果有纰漏或者有更好的一些技巧&#xf…

购买正版SOLIDWORKS软件有哪些好处?

在工程设计和制造领域,SOLIDWORKS软件以其强大的功能和广泛的应用而备受推崇。购买正版SOLIDWORKS软件,不仅是对知识产权的尊重,更是对企业和个人长远发展的明智选择。下面,我们将探讨购买正版SOLIDWORKS软件所带来的诸多好处。 …

vue vite 环境非构建包编译 React 报错定位

1. 背景 众所周知,vite 在构建生态的位置,vue 与之更是密切,主流的 vue 库几乎都与 vite 捆绑。 但有些 UI 库 如 private/ui 并没进行行编译,而是直接将源码发布到了 npm 中,无法实现兼容化,需要消费方去…

LabVIEW学习记录3 - 自定义函数

LabVIEW学习记录3 - 自定义函数 一、LabVIEW学习记录二、自定义函数及函数调用 一、LabVIEW学习记录 【labVIEW】学习记录LabVIEW学习记录2 - MySQL数据库连接与操作LabVIEW学习记录 - 实时显示时间LabVIEW学习记录4-局部变量、全局变量、共享变量 二、自定义函数及函数调用 …

【vue2项目经验总结:部署到服务器之后出现所有数据渲染失败的问题】

原因是因为在没部署到服务器之前前端为了解决跨域问题使用了代理,但是在项目部署到服务器之后,前端通常不再需要使用代理,因为代理的作用是在开发过程中帮助前端应用程序与后端服务进行通信,解决跨域访问等问题。在开发阶段&#…

海洋环境保护论文阅读记录

海洋环境保护 论文1:Critical role of wave–seabed interactions in the extensive erosion of Yellow River estuarine sediments 波浪-海床相互作用在黄河河口广泛侵中的关键作用 estuatine 河口的,港湾的 erodibility侵蚀度 sediment erodibility …

Springboot HelloWorld

新建一个maven工程 引入依赖项 <modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.11.RELEASE</version><…

LLM实战:LLM微调加速神器-Unsloth + LLama3

1. 背景 五一结束后&#xff0c;本qiang~又投入了LLM的技术海洋中&#xff0c;本期将给大家带来LLM微调神器&#xff1a;Unsloth。 正如Unsloth官方的对外宣贯&#xff1a;Easily finetune & train LLMs; Get faster with unsloth。微调训练LLM&#xff0c;可以显著提升速…

(项目)-KDE巡检报告(模板

金山云于12月26日对建行共计【30】个KDE集群,合计【198】台服务器进行了巡检服务。共发现系统风险【135】条,服务风险【1912】条,服务配置风险【368】条。 一、系统风险 1、风险分析(图片+描述) (1)磁盘使用率高 问题描述多个集群的多台服务器磁盘使用率较高,远超过…

UniAD大模型开路,智能车驶入AGI时代

作者 |老缅 编辑 |德新 在刚刚结束不久的北京车展上&#xff0c;除一众明星车型亮相&#xff0c;供应链企业也开始大秀肌肉&#xff0c;其中尤其以端到端大模型为代表&#xff0c;焕新一代的智驾技术栈掀起了新一轮热潮。 作为首个提出感知决策一体化自动驾驶通用模型的公司&…