我的个人网站www.liujianhua.xyz
最近在学数据结构,三天看了180页pdf,佩服我自己,当然最主要的还是我之前学过链表,所以前面学起来相对快,今天学到了串里面的KMP算法,研究了大半天,看了各种视频与文章,终于理解了,不得不感慨发明这算法的大佬。。
贴上我看的视频与文章链接
知乎文章
B站视频
现在来讲讲KMP算法中next数组的求取。next数组,我相信学过或者了解过KMP算法的对它一定不陌生,可以这样说,整个LMP算法的精髓就在于对next数组的求解。我将用我所看的文章图片或者视频截图为大家通俗易懂的讲,若图片有侵权,联系删除。
如果不用KMP算法,就只能暴力遍历来求解最坏的情况时间复杂度为O(m*n),显然,如果字符串过长,那时间消耗将是相当吓人的。当然,这篇文章不探讨这些,只讲next数组的求解方法。
模板字符串"aabaaf"它的next数组如图:
下面看如何来的
注意,看相同串时,头从做往右,尾从右往左!还有这种情况,两头使用了中间重复的字符,一定要注意。
然后看代码
int KmpNext(char* pat)
{
int i, j = 0;
int next[6] = {0};
for (i = 1;i <= sizeof(pat);i++)
{
while (j > 0 && pat[i] != pat[j])
j = next[j - 1];
if (pat[i] == pat[j])
{
j++;
next[i] = j;
}
}
return 0;
}
C语言实现的代码。这还只只最初级的KMP算法next数组,还有进阶版的,后面会更新。