不要心急,理解透彻算法才是根本

肯定有很多人对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算法!

一路走来,我们无法猜测将是迎接什么样的风景,

不要心急,理解透彻算法才是根本

相关文章:

你感兴趣的文章:

标签云: