首页 > 其他分享 >每日一题 --- 找出字符串中第一个匹配项的下标[力扣][Go]

每日一题 --- 找出字符串中第一个匹配项的下标[力扣][Go]

时间:2024-04-02 00:00:03浏览次数:28  
标签:--- 下标 ++ needle next 力扣 Go prifixlen haystack

找出字符串中第一个匹配项的下标

题目:28. 找出字符串中第一个匹配项的下标

给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

提示:

  • 1 <= haystack.length, needle.length <= 104
  • haystackneedle 仅由小写英文字符组成

方法一:

暴力破解,如果匹配不了就返回,能做,但是不推荐,因为有更好的。

方法二:

KMP算法,是时候拿起你们的数据结构与算法书了,这个算法无论在那个版本的书中都是重点。如果想要温习知识的可以看看这个视频:

最浅显易懂的 KMP 算法讲解_哔哩哔哩_bilibili

// KMP算法
func strStr(haystack string, needle string) int {
	nBytes := []byte(needle)
	hBytes := []byte(haystack)
	//获取next数组
	next := buildNext28(nBytes)
	i := 0 // 主串下标
	j := 0 // 子串下标
	for i < len(hBytes) {
		if nBytes[j] == haystack[i] {
			j++
			i++
		} else {
			if j > 0 {
				j = next[j-1]
			} else {
				i++
			}
		}
		if j == len(nBytes) {
			return i - j
		}
	}
	return -1
}

// next
func buildNext28(a []byte) []int {
	next := make([]int, 1, len(a))
	i := 1         // 当前下标
	prifixlen := 0 // 当前共同前缀长度
	for i < len(a) {
		if a[prifixlen] == a[i] {
			prifixlen++
			next = append(next, prifixlen)
			i++
		} else {
			if prifixlen == 0 {
				next = append(next, 0)
				i++
			} else {
				prifixlen = next[prifixlen-1]
			}
		}
	}
	return next
}

还有一种是nextval数组,能更好的优化KMP算法,感兴趣的去学习吧。

标签:---,下标,++,needle,next,力扣,Go,prifixlen,haystack
From: https://blog.csdn.net/weixin_52025712/article/details/137250881

相关文章

  • 每日一题 --- 右旋字符串[卡码][Go]
    右旋字符串题目:55.右旋字符串(第八期模拟笔试)(kamacoder.com)题目描述字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串s和一个正整数k,请编写一个函数,将字符串中的后面k个字符移到字符串的前面,实现字符串的右旋转操作。例如,对于......
  • Kubernetes kafka系列 | Strimzi 部署kafka-bridge
    Strimzi+kafka集群部署直通车一、kafkabridge介绍KafkaBridge是ApacheKafka生态系统中的一个工具或组件,用于实现Kafka与其他系统或协议之间的通信或集成。Kafka本身是一个分布式事件流平台,广泛用于构建实时数据流水线和流式应用程序。然而,并非所有系统或应用程......
  • 【书籍】Django项目实例精解(第2版) pdf 下载
    Django项目实例精解(第2版)pdf下载作者:安东尼奥·米勒ISBN:9787302526551文件格式:pdf目录第1章构建博客应用程序11.1安装Django11.1.1创建隔离的Python环境21.1.2利用pip安装Django31.2创建第一个项目31.2.1运行开发服务器51.2.2项目设置61.......
  • 【YOLOv5改进系列(11)】高效涨点----添加soft-nms(IoU,GIoU,DIoU,CIoU,EIoU,SIoU)到yol
    文章目录......
  • 【华为OD机试真题】A卷-优秀学员统计(JAVA)
    一、题目描述【华为OD机试真题】A卷-优秀学员统计(JAVA)题目描述:公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。每个员工会对应一个id,每天的打卡记录记录当天打卡员工的id集合,一共30天。请你实现......
  • 【华为OD机试真题】A卷-预定酒店(JAVA)
    一、题目描述【华为OD机试真题】A卷-预定酒店(JAVA)题目描述:放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店(n>=k>0),并由低到高打印酒店的价格二、输入输出输入描述:第一行:n,k,x......
  • c语言字符串逆序-基础知识
    c语言字符串逆序(1)错误输出(2)正确输出:方法1(3)正确输出:方法2......
  • 计算机组成与体系结构--2.6:总线系统,2.7:寻址方式,2.8:CISC与RISC
    转上一节:http://t.csdnimg.cn/3xoZahttp://t.csdnimg.cn/3xoZa2.6:总线系统按照连接对象分为:内总线(又称为系统总线,各功能部件之间的传输通路)和外总线(又称通信总线,是系统之间或是计算机主机与外围设备之间的传输通路)按照通信仿式分为:串行总线(数据按位依次传输)和并行......
  • 【论文解读】PA-Sketch: A Fast and Accurate Sketch for Differentiated Flow Estima
    论文链接:https://ieeexplore.ieee.org/abstract/document/10355581开源代码:无0.问题和关键见解问题:大多数已有的草图方法都忽略了流优先级之间的区别,尽管高优先级的流相对稀少,但却蕴含着重要信息。因此,最近出现了一系列优先级感知草图的工作,旨在为不同优先级的流提供不......
  • vant-weapp 提供的areaList城市数据的路径问题
    根据vant官网提供的引入方法会报错。通过add@vant/area-data会下载一份index.esm.mjs文件城市数据在项目中,我尝试了用各种路径来获取还是报错,最后只能将该index.esm.mjs文件复制到其他文件中,然后引入就可以了。 1.新建一个文件夹专门放数据的,然后在建个文件用来放这个......