kmp 算法总结

本文通过两个关键示例,深入浅出地解析了KMP算法的核心思想与next数组的构造方法,帮助读者理解并掌握这一高效字符串匹配算法。

肯定有很多人对kmp算法,学了很多遍了,还是不懂,其实,很简单,我们简单的来看两个问题,就可以了!

一般的暴力算法,大家,应该都知道,扫两次,直接比较,就可以得到答案了,

我们直接来看,有没有可以简化

首先,和一般的算法一样,直接匹配,直到p[i]!=p[j];这时,如果是一般的算法i要回退回去,j也要从新开始,但我们没有好好的利用已经得到的有用信息


如图已经知道了,前面一段是相等的,我们能不能想个办法,不让i移动,直接比较呢,这是有的,如果我们知道,j前面字符串的,最大前缀等于后缀,就是标记的A是相等的,

那么,就不用移动i了,直接比较p[i]==p[next[j]],就可以了!

这样,就引入了next数组,next数组,简单点,就是最大前缀等于后缀,就是要求出上图的最大的A的长度,就可以了!

那么如何求出A最大的长度呢,看这个图

如果p[i-1] == p[k],那么,我们就可以直接得到next[i]= next [i-1]+1;

如果,不相等,我们可以用递推求出,


如图,我们这是知道了,p[i-1] != p[k];但我们也同时知道了有用信息A0 A1 A2是相同的字符串!

这时,我们把k = next[k],那么,根据next 数组的定义,我们知道B0 B1 B2 B3 B4 B5都是相同的了,那么,我们只要比较p[i-1] == p[next[k]],就可以得出next[i-1]了,当然,如果还不相等,就再k = next [k],这样,就一定,找到最开始的点结束,就可以得到答案了!

我学kmp也是不懂为什么,所以老是忘,自从画了这两个图,就再也不用背代码了,可以自己写出来了,所以希望读者,明白这两个图,就自然明白了kmp算法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值