Golang leetcode28 找出字符串中第一个匹配项的下标 KMP算法详解

文章目录

  • 找出字符串中第一个匹配项的下标 leetcode28 串的模式匹配问题
    • 暴力求解
    • 使用KMP模式匹配算法
      • KMP算法简述
    • KMP算法的代码实现

找出字符串中第一个匹配项的下标 leetcode28 串的模式匹配问题

暴力求解

func strStr(haystack string, needle string) int {
L := len(needle)
Cap := len(haystack)H := []byte(haystack)
N := []byte(needle)for i, val := range H {if val == N[0] {
if i+L <= Cap && haystack[i:i+L] == needle {
return i
}
}
}
return -1
}

使用KMP模式匹配算法

KMP算法简述

当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。
其主要的用途就是查找字符串,从主字符串中寻找模式字符串
其相比暴力解法,时间复杂度从O(mXn)》O(m+n)

所以如何记录已经匹配的文本内容,是KMP的重点,也是next数组肩负的重任。

什么叫字符串的前缀后缀
对于字符串ababc 来说,它的前缀[a,ab,aba,abab],也就是以字符串第一个字符作为开头,同时不包括最后一个字符的所有子串,
同理它的后缀[c,bc,abc,babc],也就是以字符串最后一个字符作为结尾,同时不包括第一个字符的所有字串。

  1. 思路分析
    当我们进行字符串匹配时,假如第一次匹配失败时如图所示
    在这里插入图片描述

第4个字母不一致,但前三个字母是一致的,那么当我们继续寻找时,没有必要再从第一个字母开始对应
在这里插入图片描述

为什么我们能看出不从第一个字母进行对应呢?
续接我们提到的前后缀的概念,前三个字符为aba,则前缀为a,ab 后缀为 a,ba,二者之中最长的相等的部分为a,一般称这个最长的部分为最长公共前后缀
由此,我们第一个字母a就没有必要再进行比较,直接从第2个字母开始进行比较即可
那么,从这里我们又能够发现,下次从第几个数字开始进行比较,只跟这次重复的子串有关系,
因此我们可以对模式字符串建立一个数组,分别记录当第几个开始不对应时,下次从第几个再开始比较,也就是常说的next
2. next数组(前缀表)
前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。

  1. 使用next数组来进行匹配
    以下我们以前缀表统一减一之后的next数组来做演示。
    有了next数组,就可以根据next数组来 匹配文本串s,和模式串t了。
    注意next数组是新前缀表(旧前缀表统一减一了)。
    这里借用代码随想录中的gif来示意:
    在这里插入图片描述

KMP算法的代码实现

思路可以参考这篇文章

  1. 计算next数组
// 此函数用来初始化next数组
func initNext(needle string) []int {//后缀中末尾  abc中ci := 1//前缀中末尾;同时在这里也有着记录最长公共串长度的作用,二者本质是一样的j := 0L := len(needle)//初始化next数组;next[0]默认为0,因为对于一个字母我们不认为其具有前后缀,后续也不会再对next[0]进行赋值next := make([]int, L)//求next数组过程中,我们的i不回退,采用类似于动态规划的思想,也是我们这里的循环条件for i < L {//如果前后缀匹配if needle[i] == needle[j] {//前缀末尾向后移一位,同时代表长度+1j++//当前后缀末尾所在位置的最长子串即为j//最长子串是有基础的,如果next[2]=2,那么next[3]的可能性为3或者0,这里是为3的情况next[i] = j//后缀末尾向后移一位i++} else { //如果前后缀不匹配//当j>0,说明仍旧处于回退的过程if j > 0 {j = next[j-1]} else { //如果j=0,并且前后缀依旧不匹配,则长度计数应该重新从0开始//这里是为0的情况next[i] = j//后缀末尾向后移i++}}}//返回next数组return next
}
  1. 利用next数组进行字符串的匹配
// kmp算法,用空间换时间
func strStr(haystack string, needle string) int {//获取next数组next := initNext(needle)//主串长度L := len(haystack)//目标匹配长度,即needle的长度target := len(needle)//匹配字符串中指针位置j := 0//i为主串中指针的位置for i := 0; i < L; {// 如果匹配上了if haystack[i] == needle[j] {if j == target-1 {return i - target + 1}j++i++} else { //如果没匹配上//跟计算next数组有异曲同工之妙if j > 0 {j = next[j-1]} else {i++}}}return -1
}

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

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

相关文章

wayland(wl_shell) + egl + opengles 最简实例

文章目录 前言一、ubuntu 上相关环境准备1. ubuntu 上安装 weston2. 确定ubuntu 上安装的opengles 版本3. 确定安装的 weston 是否支持 wl_shell 接口二、窗口管理器接口 wl_shell 介绍二、代码实例1.egl_wayland_demo.c2. 编译和运行2.1 编译2.2 运行总结参考资料前言 本文主…

UE5 C++学习笔记 FString FName FText相互转换

1.FString 是UE里的String。最接近std::string, 唯一可以修改的字符串类型。性能更低 TEXT(string) TEXT宏&#xff0c;作用是将字符串转换成Unicode&#xff0c;切记UE中使用字符串输出要使用该宏 2. FName 是UE里特有的类型。它更注重于表示名称不区分大小写&#xff0c;不…

基于taro搭建小程序多项目框架,记重点了!!!

前言 为什么需要这样一个框架&#xff0c;以及这个框架带来的好处是什么&#xff1f; 从字面意思上理解&#xff1a;该框架可以用来同时管理多个小程序&#xff0c;并且可以抽离公用组件或业务逻辑供各个小程序使用。当你工作中面临这种同时维护多个小程序的业务场景时&#…

web架构师编辑器内容-完成属性设置的优化

对于业务组件来说&#xff0c;其属性是有很多的&#xff0c;如果把所有属性都平铺在页面上&#xff0c;就会非常长&#xff0c;而且想要更改其中的某些属性&#xff0c;可能需要向下滚动很久才能找到&#xff0c;对于UI的交互不是很友好&#xff0c;需要对属性的不同特性进行分…

KDJ指标的算法、原理和特性

KDJ的完整中文名称是随机摆动指标&#xff0c;是短线交易者最常用的指标之一。作为应用最广泛的指标之一&#xff0c;KDJ的用法网上随处可见&#xff0c;但大部分介绍都只会告诉你超买超卖&#xff0c;金叉死叉&#xff0c;详细点的讲讲背离和钝化&#xff0c;至于为什么这么用…

填空题如何去掉答案?教你3个去除小妙招

填空题如何去掉答案&#xff1f;在日常学习过程中&#xff0c;将写过的试卷填空题去掉答案&#xff0c;是一种非常有效的学习方法&#xff0c;可以帮助学生们更好地巩固和扩充知识点。首先&#xff0c;去掉答案可以让学生们重新审视题目&#xff0c;加深对知识点的理解。其次&a…

【RT-DETR有效改进】Google | EfficientNetV2一种超轻量又高效的网络 (轻量化网络)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

鸿蒙开发笔记(二十): 常用组件 TextInput/TextArea, 弹窗,视频播放Video

1. 文本输入 TextInput/TextArea TextInput为单行输入框、TextArea为多行输入框。通过以下接口来创建。 TextArea(value?:{placeholder?: ResourceStr, text?: ResourceStr, controller?: TextAreaController})TextInput(value?:{placeholder?: ResourceStr, text?: R…

小型洗衣机怎么用?实用的迷你洗衣机推荐

由于我们的内衣、内裤和袜子等等贴身小件衣物的清洁频率比一般的衣物要高。而且&#xff0c;如果我们人工手洗的话&#xff0c;不仅会大大浪费了我们的时间&#xff0c;而且还不能进行对这些贴身的以为进行深层消毒和除菌。这种情况下&#xff0c;就得需要一台专门用于清洗内衣…

数据结构·顺序表应用

本节应用是要用顺序表实现一个通讯录&#xff0c;收录联系人的姓名、性别、电话号码、住址、年龄 ​​​​​​​ 顺序表的实现在上一节中已经完成了&#xff0c;本节的任务其实就是应用上节写出来的代码的那些接口函数功能&#xff0c;做出来一个好看的&#xff0c;可…

晨控CK-FR03-EC与欧姆龙NX系列EtherCAT通讯连接说明手册

晨控CK-FR03-EC与欧姆龙NX系列EtherCAT通讯连接说明手册 晨控CK-FR03-EC是一款基于射频识别技术的高频RFID标签读卡器&#xff0c;读卡器工作频率为13.56MHZ&#xff0c;支持对I-CODE 2、I-CODE SLI等符合ISO15693国际标准协议格式标签的读取。 读卡器同时支持标准工业通讯协…

【Linux C | 进程】进程环境 | 什么是进程?进程的开始、终止、存储空间布局、命令行参数、环境变量

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

OPC UA网关BL121 支持Modbus转OPC UA协议转换

随着物联网技术的迅猛发展&#xff0c;人们深刻认识到在智能化生产和生活中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的物联网数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于工业自动化和数字化工厂应用环境中。 钡铼…

从心理学角度看海外网红营销:品牌与消费者的心理互动

近年来&#xff0c;随着社交媒体的蓬勃发展&#xff0c;海外网红营销成为品牌推广的一种独特而有效的手段。这种新型营销方式不仅仅依赖于产品本身的特性&#xff0c;更加注重通过网红与消费者之间的心理互动来建立品牌形象&#xff0c;激发购买欲望。本文Nox聚星将和大家从心理…

17.用户身份与能力

Linux系统的管理员之所以是root&#xff0c;并不是因为它的名字叫root&#xff0c;而是因为该用户的身 份号码即UID&#xff08;User IDentification&#xff09;的数值为 0。在 Linux 系统中&#xff0c;UID就像我们的身份证号 码一样具有唯一性&#xff0c;因此可通过用户的U…

【明道云】学习笔记1-了解APaaS

【背景】 APaaS (Application Platform As A Service) &#xff0c;即应用程序平台即服务&#xff0c;这是基于PaaS&#xff08;平台即服务&#xff09;的一种解决方案&#xff0c;支持应用程序在云端的开发、部署和运行&#xff0c;提供软件开发中的基础工具给用户&#xff0…

基于XG24-EK2703A的BLE HID蓝牙键盘+鼠标复合设备功能开发(BLE+HID+FreeRTOS+Gecko SDK)

目录 项目介绍硬件介绍项目设计开发环境及工程参考总体流程图硬件基本配置应用初始化按键中断回调定时器回调按键响应任务蓝牙事件回调BLE HIDReport Map及报文键盘设备鼠标设备复合设备 发送字符串上/下滚动 功能展示项目总结 &#x1f449; 【Funpack3-1】基于XG24-EK2703A的…

Java streamFile

1.Stream流 1.1体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合 把"张"开头的集合中的长度为3的元素存储到一个新的集合 遍历上一步得…

使用Scrapy 爬取“http://tuijian.hao123.com/”网页中左上角“娱乐”、“体育”、“财经”、“科技”、历史等名称和URL

一、网页信息 二、检查网页&#xff0c;找出目标内容 三、根据网页格式写正常爬虫代码 from bs4 import BeautifulSoup import requestsheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/53…

每天10个前端小知识 <Day 12>

前端面试基础知识题 1. Promise中&#xff0c;resolve后面的语句是否还会执行&#xff1f; 会被执行。如果不需要执行&#xff0c;需要在 resolve 语句前加上 return。 2. 什么是内存泄漏&#xff1f;什么原因会导致呢&#xff1f; 内存泄露的解释&#xff1a;程序中己动态…