首页 > 其他分享 >28. 找出字符串中第一个匹配项的下标 Golang实现

28. 找出字符串中第一个匹配项的下标 Golang实现

时间:2024-10-10 16:33:19浏览次数:8  
标签:下标 ++ needle 28 len Golang length 匹配

题目描述:

给你两个字符串 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]
    给一个具体的例子:(来自知乎@凉拌炒鸡蛋)
    image
    当找到下标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
}

标签:下标,++,needle,28,len,Golang,length,匹配
From: https://www.cnblogs.com/CharlseGo/p/18456661

相关文章

  • AT_abc283_g [ABC283G] Partial Xor Enumeration 题解
    题目传送门前置知识线性基解法考虑线性基。因为有可空子序列也参与运算,所以第\(1\)小的数是\(0\);但线性基中是不允许有异或和为\(0\)的存在,故线性空间内第\(k-1\)小的数就是所求的第\(k\)小的数。令每一个二进制位仅在它这一位的基底上出现,其他位上的基底直接异或......
  • 游戏革命!Series AI获2800万美元融资,携手Netflix、戴尔打造GenAI游戏开发平台
     一句话定位Series是一家通过生成式AI技术,为游戏开发者提供全栈游戏创作平台的公司,致力于革新未来的游戏开发模式。一、数据概览成立时间:2023年种子轮融资:790万美元,由a16z领投A轮融资:2800万美元,投资方包括Netflix、DellTechnologiesCapital、a16z、BITKRAFT和F4Fu......
  • 2024-9-28
    新闻周刊2024.9.28导入:建立"定点医药机构相干人员"实行驾照式经分传统监管机构将从医药机构进一步精确到人的进步,让少部分违规人员收到更加严厉的处罚防止医保滥用,让违规者付出应有代价,确保医保资金真正惠民,让所有人都共同收益.视点:秋收"惠农"时农条机械化农......
  • SSM湘农乐市农产品交易平台-计算机毕业设计源码28246
    目 录SSM湘农乐市农产品交易平台1绪论1.1研究背景1.2研究意义1.3研究方法1.4论文结构与章节安排2 湘农乐市农产品交易平台系统分析2.1可行性分析2.2系统流程分析2.3 系统功能分析2.4 系统用例分析2.5本章小结3湘农乐市农产品交易平台总体设......
  • Golang 中的强大 TUI 库 ——tview
    在命令行界面下创建丰富的用户交互界面是许多开发者的需求,而Golang语言中有一个非常出色的TUI(文本用户界面)库——tview。本文将详细介绍tview库,并与其他流行的TUI库进行对比,最后进行总结。一、tview库介绍tview是一个用于创建终端用户界面的Golang库。它提供......
  • LED显示驱动/高亮数显屏驱动芯片VK16K33A 采用SOP28封装形式,可支持16SEGx8GRID的点阵L
    VK16K33A是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片,邱婷:188-2366-8825内部集成有数据锁存器、键盘扫描、LED驱动模块等电路。数据通过I2C通讯接口与MCU通信。SEG脚接LED阳极,GRID脚接LED阴极,可支持16SEGx8GRID的点阵LED显示面板。最大支持13×3的按键。内置上电......
  • 2018_10_28_01
    动态替换图片最简单的示例<divclass="img-wrapper"><divonclick='replacement'><imgsrc='[图片1]'></div><!-----------------><!--忽略同类型代码.--><!----------------->......
  • 代码随想录算法训练营day9|●151.翻转字符串里的单词 ●卡码网:55.右旋转字符串 ●28.
    学习资料:https://programmercarl.com/0151.翻转字符串里的单词.html学习记录:151.翻转字符串里的单词(感觉C语言能考虑巧妙解法,而python直接搞就对了)c语言:把字符串整体反转,再用双指针法(slow,fast)依次翻转每一个单词,关键在于如何移除多余空格,用slow指针找到要替换到的位置,用fast......
  • 2020_01_28
    mac休眠之后wifi无法连接解决方案:删除与网络配置有关的plist文件第一步进入网络配置目录打开终端,输入cd/Library/Preferences/SystemConfiguration/备份原来的配置文件sudozipbackup.zip\com.apple.airport.preferences.plist\com.apple.......
  • 2018_10_28_01
    vscode配置vscode插件AtomOneDarkThemeAutoRenameTagvscode-language-babelChinese(Simplified)LanguagePackforVisualStudioCodeCodeSpellCheckerDockerESLintHopscotch(Official)IntelliJIDEAKeybindingsminapp-vscodePathIntellisensePHPDebu......