这里只讲KMP算法里的next数组如何计算,至于有什么作用可以看别的文章。
KMP算法在我看来是比较难理解的,但是求串的next数组这种题目经常考。
1 next数组计算方式
- 第一位直接写0,第二位直接写1
- 从第三位开始,找第三位前面的子串的前缀与后缀相等的最大长度。其next值就是最大长度+1
2 解释
这里比较难理解的就是第二条,什么叫前面子串的前缀与后缀相等的最大长度?
这里举个例子,有一个字符串ababaaababaa,求第四位的next值
前四位是abab,那么根据第二条规则,要找当前的next值,就看其前面子串,这里就是aba。那么aba的前缀与后缀相等的最大长度又是什么呢?
这里a叫一个前缀,ab也叫一个前缀,但aba就不是一个前缀,他已经和第四位前面的子串相同了。
同样的道理,a是一个后缀,ba也是一个后缀,但aba不是一个后缀,他已经和第四位前面的子串相同了。
搞懂了什么叫前缀和后缀,那么接下来就是理解前缀后缀相同的最大长度。
我们知道a是一个前缀,a是一个后缀,a等于a,那么接着找,看看有没有更大的。ab是一个前缀,ba是一个后缀,但ab不等于ba。所以这里的最大长度为1,那么根据第二条规则,next值等于最大长度+1,所以第四位最大长度为2。
3 例题讲解
那么用一道例题来讲解一下,你可以用张草稿纸跟这写。
根据规则1,第一位写0,第二位写1。
从第三位开始,就要根据当前位前面的子串的前缀和后缀相等的最大长度+1来计算
第三位前面的子串是ab,显然最大长度为0,所以第三位的next数组就是0+1=1。
第四位前面的子串是aba,刚才讲的就是这个例子,next值是2。
第五位前面的子串是abab,可以一眼看出,前缀是ab,后缀是ab的时候满足前缀等于后缀并且长度最长,长度为2,next值还要+1,所以第五位next值是3。
同样的道理,一直找......
实际上算到第三位就已经知道答案了,选C。
4 总结
实际上要求next数组还是很简单的,就是要注意细节,不要找漏最大长度就好。
5 更多例题练习
(1)
(2)