KMP算法

本文详细介绍了如何通过KMP算法构建next数组,以O(m)的时间复杂度预处理,然后展示了如何在O(m+n)的整体复杂度下进行字符串匹配。通过实例演示了getnext函数的实现及其在strStr方法中的应用。

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

在这里插入图片描述
上图可以看出,当匹配失败时,j要移动的下一个位置k。存在着这样的性质:序列2的位置j最前面的k个字符和序列1的位置i之前序列的最后k个字符是一样的

接下来,我们看看 next 数组是如何在 O(m)O(m) 的复杂度内被预处理出来的。
假设有匹配串 aaabbab,我们来看看对应的 next 是如何被构建出来的。链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

def getnext(needle):
    i, j, n = 1, 0, len(needle)
    nnext = [0] * n
    while i < n:
        if needle[i] == needle[j]:
            j += 1
            nnext[i] = j
            i += 1
        elif j:
            j = nnext[j - 1]
        else:
            nnext[i] = 0
            i += 1
    return nnext
needle="aaabbab"
getnext(needle)
#[0, 1, 2, 0, 0, 1, 0]

这就是整个 next 数组的构建过程,时空复杂度均为 O(m)O(m)。
至此整个 KMP 匹配过程复杂度是 O(m + n)O(m+n) 的。
在这里插入图片描述

// 方法一
class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        a=len(needle)
        b=len(haystack)
        if a==0:
            return 0
        next=self.getnext(a,needle)
        p=-1
        for j in range(b):
            while p>=0 and needle[p+1]!=haystack[j]:
                p=next[p]
            if needle[p+1]==haystack[j]:
                p+=1
            if p==a-1:
                return j-a+1
        return -1

    def getnext(self,a,needle):
        next=['' for i in range(a)]
        k=-1
        next[0]=k
        for i in range(1,len(needle)):
            while (k>-1 and needle[k+1]!=needle[i]):
                k=next[k]
            if needle[k+1]==needle[i]:
                k+=1
            next[i]=k
        return next

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值