KMP字符串匹配算法(详细版)

KMP(快速查找匹配串的算法)

问题解决:判断B是否A的子串,并找到字符串B中在字符串A中的位置。
时间复杂度 :O(N+M), N,M分别是字符串A和B的长度。
核心点:对于字符串B,数组next[i]表示B中以i结尾的非前缀子串与B的前缀能够匹配的最长长度。也就是前缀B[1]...B[next[i]]B[i-next[i]+1]....B[i]相等,很明显B[i]==B[next[i]],有了next数组之后,我们就可以对A,B字符串进行匹配了。
匹配流程

  1. 设i,j分别是指向A和B的下标,此时A[i-j]...A[i-1] == B[1]...B[j] ,也就是说B的前j的字符已经匹配成功了。
  2. 如果A[i]==B[j+1],i++,j++。
  3. 如果A[i]!=B[j+1],j=next[j],直到j==0或者A[i]==B[j+1], 为什么这样做?那是因为B[1]...B[next[j]] == B[j-next[j]+1]...B[j],所以B[1]...B[next[j]] == A[i-next[j]]...A[i-1],这样我们就只需要继续匹配A[i]和B[j+1]而不需要回溯i。

核心代码

for(int i=2,j=0;i<=m;i++)
{
    while(j&&p[i]!=p[j+1]) j=ne[j];
    if(p[i]==p[j+1]) j++;
    ne[i]=j;
}
for(int i=1,j=0;i<=n;i++)
{
    while(j&&s[i]!=p[j+1]) j=ne[j];
    if(s[i]==p[j+1]) j++;
    if(j==m) 
    {
        //匹配成功
    }
}

如何求B数组的next数组呢?
其实流程是一样的,就是B和B自己的一个匹配。

  1. 假设两个相同的字符串B1和B2,此时匹配的下标是i和j,并且next[1~i-1]已经算出来了。
  2. 不断地扩展j直到B1[j] == B2[i] 此时next[i] == j
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真的卷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值