刷题Day8|KMP专场------●28. 实现 strStr() ●459.重复的子字符串

文章介绍了KMP字符串匹配算法,包括如何构建前缀表和使用前缀表进行匹配。在构建前缀表时,重点在于处理不匹配时如何回溯。在实际匹配过程中,利用前缀表可以避免不必要的字符比较。此外,文章还提到一个应用实例,即寻找重复子字符串,其中判断条件涉及前缀表的最大值。
摘要由CSDN通过智能技术生成

今天是kmp的专场,kmp是看一次会一次,做一次忘一次。

28. 实现 strStr()

kmp主要分为两部分,一部分是构建前缀表,另一部分是根据前缀表进行匹配。
两部分里面各包含一个如果不匹配就继续向前匹配的循环,这里是最难想的部分。

func strStr(haystack string, needle string) int {
    
    lenn := len(needle)
    next := make([]int,lenn)
    next[0] = 0
    j := 0
    for i := 1; i < lenn; i++{
        for j > 0 && needle[i] != needle[j]{
            j = next[j - 1]
        }
        if needle[i] == needle[j]{
            j++
        }
        next[i] = j
    }

    key := 0
    for i := 0; i < len(haystack); i++{
        for key > 0 && haystack[i] != needle[key]{
            key = next[key - 1]
        }
        if haystack[i] == needle[key]{
            key++
            if key == lenn{
                return i - key + 1
            }
        }
    }
    return -1
}

偷个懒直接截屏记录一下
在这里插入图片描述
在这里插入图片描述

459.重复的子字符串

重复的子字符串
拿到前缀表之后,判定条件为如果next的最后才是最大的,且被最长相等前后相减后的就是最小重复单元
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值