KMP算法理解

kmp算法

字符串快速匹配算法,找到模式串P在主串T种第一次出现的位置
规定指针i和j,初始化i指向主串首个字符,j指向模式串首个字符
kmp算法,逐个字符匹配,匹配成功,i++,j++
匹配失败,如果是模式串首字符匹配失败,i后移
反之,j回溯,回溯到的位置是匹配成功的字符串的最长相同前缀后缀中,后缀的起始位置

记录匹配失败后跳转位置的数组是next数组,数组长度等于模式串长度
求next数组的方法:

void getnext(seqstring *p, int next[])
{
    int i, j;
    next[0] = -1;
    i = 0; j = -1;
    while (i < p->length)
    {
        if (j == -1 || p->str[i] == p->str[j])
        {
            ++i;
            ++j;
            next[i] = j;
        }
        else
            j = next[j];
    }
    for (i = 0; i < p->length; i++)
        printf("%d ", next[i]);
}

理解

先膜拜一下大佬的博客
https://www.cnblogs.com/yjiyjige/p/3263858.html

在这里插入图片描述

读了大佬的博客简单讲一下我个人的一点看法:
1.
kmp算法好在哪里?
对于长度为n的子串p
分治,匹配失败的原因有几种?
p种,第1,2,3。。。个字符匹配失败,但是匹配过程种可能一直犯同一种错误,如果每一次犯错误都视为一个新的错误来处理那就太笨了,所以对于每一类错误要提前分析好解决办法

2.当理解了这一个最基本的想法之后再去理解具体的处理一类错误的方法。
关键:匹配失败后回溯的位置与主串无关

这个无关并不是真正的无关,而是因为可选择的回溯范围其实就是子串自己匹配成功的部分。子串是提前可见的,我们直接子串而不是直接考虑主串就可以提前定义处理方法,并且这个方法可以适用于任何一个主串。在这里插入图片描述

在这里插入图片描述现在再来看这样一个方法,会发现我只需要对子串定义一下移动的方法,也就是用next[]保存回溯的位置就可以直接对任意一个主串使用啦,一劳永逸!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值