KMP算法代码

KMP算法本质上是字符串的自我匹配

朴素的单模式串匹配大概就是枚举每一个文本串元素,然后开始不断向后比较,每次比较失败之后都要从头开始重新比对,最差情况时间复杂度在O(n*m)左右,还是比较容易卡的。

而 KMP 的精髓在于,对于每次失配之后,都不会从头重新开始枚举,从前面重复的地方开始匹配,从而节约时间,时间复杂度为O(n);

主要代码:

int j=0;
for (int i = 2; i <=l2; i++)
{
    while(j&&st2[i]!=st2[j+1])j=k[j];
    if(st2[i]==st2[j+1])j++;
    k[i]=j;
}
j=0;
for (int i = 1; i <=l1; i++)
{
    while(j&&st1[i]!=st2[j+1])j=k[j];
    if (st1[i]==st2[j+1])j++;
    if(j==l2){
        cout<<i-l2+1<<endl;
        j=k[j];
    }
}

再理解这个模板后,KMP也就没有其它神奇之处了,自己脑补的例子再结合网上的代码慢慢理解,再多做几个题就行。

时间取决于每个人对代码的理解力,所以几个小时都理解不了的KMP算法并不能说明自身能力不行,而是意味着在解决这个算法后,自身对代码理解能力的大幅度提升,在我攻关KMP后去学图论的一些知识,感觉也并不是很难。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zjhhhzj

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

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

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

打赏作者

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

抵扣说明:

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

余额充值