一、首先了解字符串匹配的基本原理:
http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html
二、求解next数组:
void makeNext(char p[],int next[]){
int q,k;//k是最大前缀长度,q是匹配串下标
next[0] = 0;
for(q=1,k=0;q<strlen(p);q++){
//若果不相等,那么就从上一次个字符串最长前缀处查看,依次类推
while(k>0&&p[q]!=p[k]){
k = next[k-1];
}
if(p[q]==p[k]){
k++;
}
next[q] = k;
}
}
以上程序转载自https://www.cnblogs.com/bdbk/p/5202482.html
解释:
例如匹配串:abcdabd。
q:匹配串的下标
p[q]:匹配串的字符
k:最大前缀长度
p[k]:最大前缀里的最后一个字符
以上程序:p[q]=’b’,p[k]=a,在p[q]还未指向最后时,p[q]不断后移,直至p[k]=a,p[q]=a时(即abcda),此时p[k]=p[q],因此k++,next[q]为next[4]=1;
然后p[q]指向b,p[k]为b,此时为abcdab,此时p[k]=p[q],因此k++,
next[5]=2;
然后p[q]指向d,p[k]为c,此时为abcdabd,p[q]不等于p[k]且k>0,因此k=next[k-1]=next[1]=0;,next[6]=k=0;