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中c
	i := 1

	//前缀中末尾;同时在这里也有着记录最长公共串长度的作用,二者本质是一样的
	j := 0

	L := len(needle)

	//初始化next数组;next[0]默认为0,因为对于一个字母我们不认为其具有前后缀,后续也不会再对next[0]进行赋值
	next := make([]int, L)

	//求next数组过程中,我们的i不回退,采用类似于动态规划的思想,也是我们这里的循环条件
	for i < L {

		//如果前后缀匹配
		if needle[i] == needle[j] {

			//前缀末尾向后移一位,同时代表长度+1
			j++

			//当前后缀末尾所在位置的最长子串即为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
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型笔记【3】 gem5 运行模型框架LLama

一 LLama.cpp LLama.cpp 支持x86&#xff0c;arm&#xff0c;gpu的编译。 1. github 下载llama.cpp https://github.com/ggerganov/llama.cpp.git 2. gem5支持arm架构比较好&#xff0c;所以我们使用编译LLama.cpp。 以下是我对Makefile的修改 开始编译&#xff1a; make UNAME…

用pandas实现用前一行的excel的值填充后一行

今天接到一份数据需要分析&#xff0c;数据在一个excel文件里&#xff0c;内容大概形式如下&#xff1a; 后面空的格子里的值就是默认是前面的非空的值&#xff0c;由于数据分析的需要需要对重复的数据进行去重&#xff0c;去重就需要把控的cell的值补上&#xff0c;然后根据几…

2024 前端高频面试题之 JS 篇

JS 篇&#xff08;持续更新中&#xff09; 1、什么是原型、原型链&#xff1f;2、什么是继承&#xff1f;说一说有哪些&#xff1f;继承组合的原理及优点&#xff1f;3、new 操作符具体干了什么&#xff1f;4、js 有哪些方法改变 this 指向&#xff1f;5、bind 有哪些实现的注意…

时空预测网络ST-Resnet 代码复现

ST-ResNet&#xff08;Spatio-Temporal Residual Network&#xff09;是一种用于处理时空数据的深度学习模型&#xff0c;特别适用于视频、时间序列等具有时空结构的数据。下面是一个简单的使用PyTorch搭建ST-ResNet的示例代码。请注意&#xff0c;这只是一个基本的示例&#x…

一文了解国密算法SSL证书

国密算法是中国国家密码管理局发布的一组密码算法标准&#xff0c;用于替代国际上的一些加密算法。在SSL证书中&#xff0c;使用国密算法的证书通常称为"国密SSL证书"。 国密SSL证书与传统的SSL证书在加密算法上有所不同。传统SSL证书通常使用的是RSA或者ECC&#xf…

QQ失效的图片怎么恢复?这3种方法送给大家!

在我们使用QQ时&#xff0c;难免会遇到QQ图片失效的情况。或许是因为误删了聊天记录&#xff0c;又或许是因为没有及时保存而导致失效。 那么&#xff0c;面对这些失效的图片&#xff0c;我们该如何恢复呢&#xff1f;qq失效的图片怎么恢复&#xff1f;今天&#xff0c;小编将…

一起读《奔跑吧Linux内核(第2版)卷1:基础架构》- 了解kmalloc、vmalloc、malloc

大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作&#xff01; 移步飞书获得更好阅读体验&#xff1a; Docs Hello&#xff0c;大家好我是硬核王同学&#xff0c;是一名刚刚工作一年…

开源无代码应用程序生成器Saltcorn

什么是 Saltcorn &#xff1f; Saltcorn 是一个无需编写任何代码即可构建数据库 Web 应用程序的平台。它配备了一个吸睛的仪表板&#xff0c;丰富的生态系统、视图生成器以及支持主题的界面&#xff0c;使用直观的点击、拖放用户界面来构建整个应用程序。 软件的特点&#xff1…

上位机图像处理和嵌入式模块部署(流程)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;传统图像处理的方法&#xff0c;一般就是pccamera的处理方式。camera本身只是提供基本的raw data数据&#xff0c;所有的…

SpringBoot - SpringBoot手写模拟SpringBoot启动过程

依赖 建一个工程&#xff0c;两个Module: 1. springboot模块&#xff0c;表示springboot框架的源码实现 2. user包&#xff0c;表示用户业务系统&#xff0c;用来写业务代码来测试我们所模拟出来的SpringBoot 首先&#xff0c;SpringBoot是基于的Spring&#xff0c;所以我…

140:leaflet加载here地图(v2软件多种形式)

第140个 点击查看专栏目录 本示例介绍如何在vue+leaflet中添加HERE地图(v2版本的软件),并且含多种的表现形式。包括地图类型,文字标记的设置、语言的选择、PPI的设定。 v3版本和v2版本有很大的区别,关键是引用方法上,请参考文章尾部的API链接。 直接复制下面的 vue+leaf…

spring boot学习第八篇:kafka监听消费

为了实现监听器功能 pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoc…

开发者的瑞士军刀!一款适用于开发者的工具集合!

大家好&#xff0c;我是 Java陈序员。 俗话说“工欲善其事必先利其器”&#xff0c;有一个好的工具可以事半功倍。 编程开发亦是如此。 今天&#xff0c;给大家介绍一款离线的 Windows 应用程序&#xff0c;该应用涵盖常见的开发工具集合&#xff0c;旨在提高工作效率&#…

【Coding】寒假每日一题Day.5.三国游戏

题目来源 题目来自于AcWing平台&#xff1a;https://www.acwing.com/problem/content/description/4968/。 以blog的形式记录程序设计算法学习的过程&#xff0c;仅做学习记录之用。 题目描述 输入输出格式与数据范围 样例 思路 思路参考自题解&#xff1a;https://www.acwi…

Maven 打包时,依赖配置正确,但是类引入出现错误,一般是快照(Snapshot)依赖拉取策略问题

问题描述&#xff1a; 项目打包时&#xff0c;类缺少依赖&#xff0c;操作 pom.xml -> Maven -> Reload project &#xff0c;还是不生效&#xff0c;但是同事&#xff08;别人&#xff09;那里正常。 问题出现的环境&#xff1a; 可能项目是多模块项目&#xff0c;结构…

css中>>>、/deep/、::v-deep的作用和区别,element-ui自定义样式

文章目录 一、前言1.1、/deep/1.2、::v-deep1.3、>>> 二、区别三、总结四、最后 一、前言 1.1、/deep/ 在style经常用scoped属性实现组件的私有化时&#xff0c;要改变element-ui某个深层元素&#xff08;例如.el-input__inner&#xff09;或其他深层样式时&#xf…

深度学习基础之数据操作

深度学习中最常用的数据是张量&#xff0c;对张量进行操作是进行深度学习的基础。以下是对张量进行的一些操作&#xff1a; 首先我们需要先导入相关的张量库torch。 元素构造&#xff08;初始化&#xff09; 使用arange创造一个行向量&#xff0c;也就是0轴&#xff08;0维&a…

中断——外部中断EXIT

终端可以分成外部中断和内部中断吗 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 野火中断章节有这样一句话 【F103在内核水平上搭载了一个异常响应系统&#xff0c; 支持为数众多的系统异常和外部中断。 其中系统异常有8个&#xff…

学校服务器hpc东南大学,下载国家基因组科技中心数据 gsa-human ascp chatpt建议 Linux系统中写代码

使用ascp批量下载数据 You files.csv 帮我写个批量下载的脚本&#xff0c;批量下载时候&#xff0c;把路径中最后的HRR659816批量替换成 Accession列的内容就行了。下面是示例 ascp -v -QT -l 300m -P33001 -k1 -i ~/.aspera/connect/etc/aspera01.openssh_for_gsa -d asper…

HNU-数据挖掘-实验3-图深度学习

数据挖掘课程实验实验3 图深度学习 计科210X 甘晴void 202108010XXX 文章目录 数据挖掘课程实验<br>实验3 图深度学习实验背景实验要求数据集解析实验内容&#xff08;0&#xff09;基础知识&#xff1a;基于图的深度学习方法浅识&#xff1a;图卷积网络 (GCN)浅识&…