
大家既然专门过来查看next数组,说明已经大致了解,kmp算法的运行机制那接下来,next数组的理解交由我
本文分为四部分:
最长公共前后缀,最大公共前后缀是由最长前缀与最长后缀组成。从第一个字符开始的,由前向后所有字符串。从最后一个字符开始的,由后向前所有字符串。举例:ababa 所有前缀:a、ab、aba、abab、
不包含ababa所有后置:a、ba、aba、baba、不包含ababa前缀与后缀拥有相同的字符串、也就是公共字符串有a与aba,但aba长度为3,故aba同时是前缀也是后缀,故aba就是最大公共前后缀
模式串举例: 一道题中,文本串为
ababababf,模式串为ababf、求ababf对应的next数组

这里,我把ababf对应的next数组画了出来,其实,next数组中,每个索引对应的是相应的字符个数。
例如ab前缀a,后缀b。最大公共前后缀为0
abab前缀a、ab、aba,后缀b、ab、bab,最大公共前后缀为ab,故为2。由此得出下表。

本图最下方一排,就为next数组对应的数据,至于为何?是为了方便kmp匹配用。
C++
C++写法
void getNext(int* next, const string& s){
int j = -1;
next[0] = j;
for(int i = 1; i < s.size(); i++) { // 注意i从1开始
while (j >= 0 && s[i] != s[j + 1]) { // 前后缀不相同了
j = next[j]; // 向前回退
}
if (s[i] == s[j + 1]) { // 找到相同的前后缀
j++;
}
next[i] = j; // 将j(前缀的长度)赋给next[i]
}
}Java
java写法
public void getNext(int[] next, String s){
int j = -1;
next[0] = j;
for (int i = 1; i < s.length(); i++){
while(j >= 0 && s.charAt(i) != s.charAt(j+1)){
j=next[j];
}
if(s.charAt(i) == s.charAt(j+1)){
j++;
}
next[i] = j;
}
}终于,大功告成,如果大家,有什么疑问以及建议,评论区留言。
给大家推荐个KMP写的很好的博客;,虽然我第一遍咋看明白,但后来受益匪浅
再见。