28. 找出字符串中第一个匹配项的下标 Golang实现
题目描述:
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
示例 1:
输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。
思路分析:
在进入主要流程之前应该进行非法行为断定:
- 因为在题目中已经表示了两个字符串不会为空,所以不需要判断是否为空的情况
- 如果模式串比目标串要长,则不可能有符合条件的下标,于是这种情况非法,其余情况正常继续。
找一个模式串在目标串中的起始位置,典型的KMP算法。有两种实现方法:暴力循环和KMP方法。他们的区别在于暴力法的复杂度是O(n^2)和O(m+n)。
暴力循环法:
就是依次从目标串的第一个位置不断开始找,如果达到模式串的长度时的字符串仍然相同,那就说明查找成功。否则从下一个开始的位置进行查找,具体实现如下,重点关注一下两个循环的指针的设计方案。用模式串的长度进行指针挪动可以减少一次循环。
点击查看代码
func strStr(haystack string, needle string) int {
if len(needle) == 0 {
return 0
}
var i, j int
// i不需要到len-1
for i = 0; i < len(haystack)-len(needle)+1; i++ {
for j = 0; j < len(needle); j++ {
if haystack[i+j] != needle[j] {
break
}
}
// 判断字符串长度是否相等
if len(needle) == j {
return i
}
}
return -1
}
KMP算法
前缀: 包含第一个字符的子串
KMP算法的核心就是利用之前的匹配过程的信息(最长公共前缀。因为他在匹配的过程中记录最长公共子串的长度,他相当于是对称的===:前面几个长度的字符和后面几个字符的长度是相同的,并且如果next数组(记录当前公共子串的长度)的值不为0,就说明到目前为止模式串和目标串的元素是有相同的的存在的。
即有三种情况:
p []int //寻找LPS的string
next []int //存储LPS的数组
length int //当前最长的LPS长度
- 当前字符串相同的,匹配成功。length++,向后移动
- 匹配失败:当前字符和之前的字符也没有能够组成的LPS,这里需要递归寻找,具体操作方法为:
else if length!=0 {
//只有这个判断条件没有发生i++,即找到相同的为止,要么重新找。这就是递归的体现。
length = lps[length-1]
给一个具体的例子:(来自知乎@凉拌炒鸡蛋)

当找到下标13的c的时候,发生不匹配现象,但是之前串的length = 5,如果从头开始匹配复杂度就又上去了,所以依然要利用之前的匹配信息,将length-1直到为0看是否匹配。length-1的效果:其实就是不断缩短前缀的长度,看到最新不匹配的位置是否能通过减少字符的方法匹配上,他减少2个字符就匹配上了。 - 实在不匹配就置为0,向后继续匹配。
代码:
点击查看代码
func computeLPSArray(pat string) []int {
lps:=make([]int,len(pat))
length:= 0
//从位置1开始遍历,找最长前缀长度
for i := 1; i < len(pat);{
if pat[i]==pat[length] {
length++
lps[i] = length
i++
}else if length!=0 {
//只有这个判断条件没有发生i++,即找到相同的为止,要么重新找。这就是递归的体现。
length = lps[length-1]
}else {
lps[i] = 0
i++
}
}
return lps
}
28. 找出字符串中第一个匹配项的下标 Golang实现的更多相关文章
- 剑指Offer 找出字符串中第一个只出现一次的字符
题目描述 找出字符串中第一个只出现一次的字符 如果无此字符 请输出'.' 输入描述: 输入一串字符,由小写字母组成 输出描述: 输出一个字符 输入例子: asdfasdfo 输出例子: o 思路:数组 ...
- 找出字符串中第一个不重复的字符(JavaScript实现)
如题~ 此算法仅供参考,小菜基本不懂高深的算法,只能用最朴实的思想去表达. //找出字符串中第一个不重复的字符 // firstUniqueChar("vdctdvc"); --& ...
- C++版 - 剑指Offer 面试题35:第一个只出现一次的字符 解题报告(华为OJ034-找出字符串中第一个只出现一次的字符)
面试题35:第一个只出现一次的字符 题目:在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b.(2006年google的一道笔试题.) 分析: 首先应向确认一下是ASCII字 ...
- [LeetCode] Find All Anagrams in a String 找出字符串中所有的变位词
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings ...
- 【easy】438.Find All Anagrams in a String 找出字符串中所有的变位词
Input: s: "abab" p: "ab" Output: [0, 1, 2] Explanation: The substring with start ...
- js常会问的问题:找出字符串中出现次数最多的字符。
一.循环obj let testStr = 'asdasddsfdsfadsfdghdadsdfdgdasd'; function getMax(str) { let obj = {}; for(le ...
- 【SQLSERVER】如何找出字符串中的数字
可以通过写自定义函数实现,以下提供两种思路来解决: 1.通过正则匹配,找到字符串中的数字,一个一个拼起来 /*方法一: 一个一个找出来*/ CREATE FUNCTION [dbo].[Fun_Get ...
- [LeetCode] 438. Find All Anagrams in a String 找出字符串中所有的变位词
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings ...
- C/C+面试题一:找出字符串中出现最多的字符和次数,时间复杂度小于O(n^2)
已知字符串"aabbbcddddeeffffghijklmnopqrst"编程找出出现最多的字符和次数,要求时间复杂度小于O(n^2) /********************* ...
- python 找出字符串中出现次数最多的字母
# 请大家找出s=”aabbccddxxxxffff”中 出现次数最多的字母 # 第一种方法,字典方式: s="aabbccddxxxxffff" count ={} for i ...
随机推荐
- windows上传app到构建版本的方法
ios打包好ipa文件后,ipa文件需要上架到app store,用户才能安装.而在app store里,无法直接将ipa上传,需要使用工具上传,但是官方提供的工具,比如xcode等只能安装在苹果电脑 ...
- ansible 部署hadoop
规划 ansible 节点 ansible controller 镜像rhel 8.2 镜像ansible hadoop 集群 master slave1 slave2 镜像centos 1810 0 ...
- layui下拉框的数据如何直接从数据库提取(动态赋值)
代码说明部分 第一步:先把layui官方给的模板粘到自己的前端注:下面的代码是我直接从layui官网粘过来的 <div class="layui-form-item"> ...
- 汇编+qemu玩转控制台打印
有段时间开始对汇编感兴趣,也因此在写各种不同的demo,现在分享之前学习的成果,需要下载的东西有nasm和qemu-system-i386,看看枯燥的汇编能产生多大的能量. 先来复习一下通用寄存器: ...
- 大模型时代该用什么样的显卡 —— 实验室新进两块A800显卡
具体如图: (这两个显卡是专为实验室的大模型方向提供的) 关于A800显卡的性能参数: (上图源自:https://www.zhihu.com/question/618932114/answer/32 ...
- 关于英语的语言规范问题——美式英语、英式英语和中式英语(Chinese English)到底哪个才是正宗 —— 中式英语才是英语世界的未来
因为日常生成生活中总是会使用英语进行阅读.写作.学习和交流表达,由于小的时候是学传统正宗英语(英式英语),后来长大后因为美国实力强又开始学这个时候的正宗英语(美式英语),但是由于个人的能力问题(农村娃 ...
- 这学校真是“nice”——人还未走,网就先停了
人还没走,手续还没办,网就给我停了,这就要清人了,这学校太"nice"了!!!
- Sentry 产品指南文档(附:详细脑图整理)
Sentry 基础知识 https://docs.sentry.io/product/ https://docs.sentry.io/product/sentry-basics/ 问题 https:/ ...
- USACO 2023DEC Bronze
http://www.usaco.org/index.php?page=dec23results 摆了一晚上,十点多才开,以为都是 sb 题,结果我是 sb T1 交了个暴力过了才意识到复杂度是对的 ...
- 简简单单教你如何用C语言实现获取当前所有可用网口!
一.获取本机所有可用网卡名 原理: 在 Linux 系统中,/proc 目录是一个位于内存中的伪文件系统. /proc目录是内核提供给我们的查询中心,通过查询该目录下的文件内容,可以获取到有关系统硬件 ...