KMP 手写算法

该文章介绍了KMP算法中的next数组构建过程,通过双指针方法动态计算next数组,然后利用next数组进行字符串匹配,找到子串在主串中首次出现的位置。在Python代码示例中,详细展示了如何找到next数组以及执行匹配操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是我第三次看kmp算法。。这次搞懂了就在这里记录一下,下次忘了可以看看

对于一个字符串的next数组,我引用一下这篇文章哈https://www.acwing.com/solution/content/14666/
在这里插入图片描述
现在就是放到代码里要这么求这个next数组呢,要用到两个指针,一个指针就是遍历整个字符串,另一个是处理前缀和的长度
请添加图片描述
请添加图片描述
请添加图片描述

以下代码匹配主串中子串第一个出现的起始点和终止点

def find_next(p):
    next = [0] * (len(p)+1)
    j,k = 0,-1
    next[0] = -1  # 防止死循环 k一直等于0 j也不加
    while(j < len(p) - 1):
        if (k == -1 or p[j] == p[k]):
            j += 1
            k += 1
            next[j] = k
        else:
            k = next[k]
    next[0] = 0
    return next

if __name__ == '__main__':
    n = int(input())
    p = str(input())
    m = int(input())
    s = str(input())
    next = find_next(p)
    i = 0 # 主串中的指针
    j = 0 # 子串中的指针
    while i < len(s):
        if s[i] == p[j]:
            i += 1 
            j += 1
        elif j > 0:  # 匹配失败,根据next跳过前面的字符串
            j = next[j]
        else :  # 字符串第一个就匹配失败
            i = i + 1
        if j == len(p):
            print(i - j, i-1) # 匹配第一个字符串起始和终点
            break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值