相信来的同学对于kmp算法有了解那么就单独说一下next数组如何求解:
对于一个字符串a b d f a b d b;
下标 0 1 2 3 4 5 6 7;
我们先对其演示一下next数组的过程;
1:int next[10050]; next[i]的意义代表第i+1个元素结尾的字符串的前后缀相等的最大值的个数;例如:next[4]:代表a b d f a;前后缀相等就一个a,则next[4]=1;同理对于next[5]:a b d f a b。
前后缀都有ab,则next[5]=2;
2:现在开始演示,定义两个指针i=1,j=0。
(1):j=0,i=1。m[i]!=m[j],next[1]=0,i++。
(2)j=0,i=1,m[i]!=m[j],next[2]=0,i++;
以此类推一直到m[i]==m[j],此时next[i]==j+1;
再走到m[i]!=m[j]时,应该怎么办呢,对于这个a b d f a b d b;
next数组0 0 0 0 1 2;
此时i=2,j=6,m[j]!=m[i];此时应该进行回退,即j=next[j-1];
0 1 2 3 4 5 6 7 8 9;不代表数字代表数组下标。
例如,如果i=9;j=4;不相等进行回溯,如果next[8]=4;代表前9个有4个匹配,即0 1 2 3 匹配5 6 7 8;此时如果第5个和第10个相等next[9]=5;如果不相等的话找next[j-1];即next[3],
如果next[3]=2;代表0 1和2 3匹配,此前 0 1 2 3和 5 6 7 8匹配,即0 1和 2 3 和5 6和7 8相等此时如果第3个和第10个匹配next[9]=3;
你还可以假设其他情况,演算。
int j=0;
for(int i=1;i<l1;i++){
while(j>0&&m[i]!=m[j]){
j=kmp[j-1];
}
if(m[i]==m[j]){
j++;
}
kmp[i]=j;
}
j=0;