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.rhkb.cn/news/242817.html

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

相关文章

文件操作和IO(1)

认识文件 先来认识狭义上的文件(存储在硬盘(磁盘)上).针对硬盘这种持久化的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般. 注意:硬盘 ! 磁盘 磁盘属于…

LV.19 D1 C++简介 学习笔记

一、C概述 1.1 C的前世今生 C是一种被广泛使用的计算机程序设计语言。它是一种通用程序设计语言&#xff0c;支持多重编程范式&#xff0c;例如过程化程序设计、面向对象程序设计、泛型程序设计和函数式程序设计等。 C的发展&#xff1a; 1.2 C的主要应用领域 C是一门运用很广…

OpenCV——双边滤波

目录 一、双边滤波二、C代码三、python代码四、结果展示 OpenCV——双边滤波由CSDN点云侠原创。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫与GPT。 一、双边滤波 双边滤波是一种综合考虑滤波器内图像空域信息和滤波器内图像像素灰度值相似性的…

【代码实战】从0到1实现transformer

获取数据 import pathlibimport tensorflow as tf# download dataset provided by Anki: https://www.manythings.org/anki/ text_file tf.keras.utils.get_file(fname"fra-eng.zip",origin"http://storage.googleapis.com/download.tensorflow.org/data/fra-…

使用golang对接微软Azure AI翻译

文章目录 一、官方地址二、准备工作三、代码示例 一、官方地址 https://learn.microsoft.com/zh-CN/azure/ai-services/translator/translator-text-apis?tabsgo 二、准备工作 创建服务 创建服务连接地址&#xff1a;https://portal.azure.com/#create/Microsoft.CognitiveS…

回调地狱与解决方案

什么是回调地狱&#xff1f; 简单理解就是回调函数嵌套回调 示例&#xff1a; setTimeout(() > {console.log(1);setTimeout(() > {console.log(2);setTimeout(() > {console.log(3);}, 1000);}, 2000)}, 3000)如上代码所示&#xff0c;回调函数嵌套回调&#xff0c;就…

【golang】Context超时控制与原理

Context 在Go语言圈子中流行着一句话&#xff1a; Never start a goroutine without knowing how it will stop。 翻译&#xff1a;如果你不知道协程如何退出&#xff0c;就不要使用它。 在创建协程时&#xff0c;我们可能还会再创建一些别的子协程&#xff0c;那么这些协程的…

git使用的常用指令

git作为一个版本控制工具&#xff0c;和maven并合称为实习的两大杀手工具。今天我来给大家介绍一下git的常用指令&#xff0c;帮助大家在实习和多人协同开发的时候提供一些帮助。 找到git管理的文件夹 命令1 git init 这个命令是为了初始化本地库 命令2 查看当前的git状态…

Springboot 子工程构建完后无法找到springboot依赖

问题: 构建完子工程后无法找到SpringBootTest 解决方案: 最好用这个构建 https://www.cnblogs.com/he-wen/p/16735239.html 1.先观察项目目录 是否正确 2.观察子工程目录 3.看pom.xml中是否引用springboot依赖 4.检查代码 查看父项目是否包含子模块 查看子模块的父项目是否…

AI教我学编程之C#类的基本概念(1)

前言 在AI教我学编程之C#类型 中&#xff0c;我们学习了C#类型的的基础知识&#xff0c;而类正是类型的一种. 目录 区分类和类型 什么是类&#xff1f; 对话AI 追问 实操 追踪属性的使用 AI登场 逐步推进 提出疑问 药不能停 终于实现 探索事件的使用 异步/交互操作 耗时操…

选择排序(二)——堆排序(性能)与直接选择排序

目录 一.前言 二.选择排序 2.1 堆排序 2.2选择排序 2.2.1 基本思想 2.2.2直接选择排序 三.结语 一.前言 本文给大家带来的是选择排序&#xff0c;其中选择排序中的堆排序在之前我们已经有过详解所以本次主要是对比排序性能&#xff0c;感兴趣的友友可移步观看堆排&#…

Pyro —— Creating Explosions

目录 Sourcing Adding debris to an explosion Adding sparks to an explosion Trails Trail Path Shapes Trail Source Types Understanding trails Incorporating trails into your explosion Sourcing Pyro Burst Source节点创建爆炸核心源&#xff0c;且对外观塑形…

Linux 系统之部署 h5ai 目录列表程序

一、h5ai 介绍 1.1&#xff09;h5ai 简介 h5ai 是用于 HTTP Web 服务器的现代文件索引器&#xff0c;专注于您的文件。目录以吸引人的方式显示&#xff0c;浏览它们通过不同的视图、面包屑和树概述得到增强。最初 h5ai 是 HTML5 Apache Index 的首字母缩写&#xff0c;但现在它…

midjourney充值订阅卡被拒绝了怎么办?

一、 AI绘图是什么&#xff1f; 就是AI绘画&#xff0c;顾名思义就是利用人工智能进行绘画&#xff0c;是人工智能生成内容&#xff08;AIGC&#xff09;的一个应用场景。其主要原理简单来说就是收集大量已有作品数据&#xff0c;通过算法对它们进行解析&#xff0c;最后再生成…

消息队列介绍

什么是 MQ MQ(message queue)&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中&#xff0c;MQ 是一种非常常 见的上下游“逻辑解耦…

131. 分割回文串 - 力扣(LeetCode)

问题描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 输入示例 s "aab"输出示例 [["a","a","b"],["…

Spring Boot 配置双数据源

Spring Boot 配置双数据源 目录概述需求&#xff1a; 设计思路实现思路分析1.基本步骤2.实例 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for cha…

SpringBoot 统计API接口用时该使用过滤器还是拦截器?

统计请求的处理时间&#xff08;用时&#xff09;既可以使用 Servlet 过滤器&#xff08;Filter&#xff09;&#xff0c;也可以使用 Spring 拦截器&#xff08;Interceptor&#xff09;。两者都可以在请求处理前后插入自定义逻辑&#xff0c;从而实现对请求响应时间的统计。 …

一个简单的ETCD GUI工具

使用ETCD没有好用的GUI工具&#xff0c;随手用c#写了一个&#xff0c; 做得好玩的一个ETCD GUI工具&#xff0c;后面加上CLI 工具&#xff0c;类似于 redis Cli工具一样&#xff0c;简化在 Linux下面的操作&#xff0c;不知道有没有必要&#xff0c; git 地址如下&#xff0c;…

【AI】小白入门笔记

前言 2024年&#xff0c;愿新年胜旧年&#xff01;作为AI世界的小白&#xff0c;今天先来从一些概念讲起&#xff0c;希望路过的朋友们多多指教&#xff01; 正文 AI (人工智能) 提起AI, 大家可能会想起各种机器人&#xff0c;移动手机的“Siri”,"小爱同学", 是语…