KMP算法:
输入:主串S,模式T
输出:T在S中的位置
J = a b c a c
Next[j] = { -1 0 0 0 1 }
第一趟匹配 i-> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
I=2,j=2 a b a b c a b c c a b c a c b a b
匹配失败 j-> a b c a c
i不动,j回溯到next[2],及j=0;
第二趟匹配 i-> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
I=6,j=4 a b a b c a b c c a b c a c b a b
匹配失败 j-> a b c a c
i不动,j回溯到next[4],及j=1;
第三趟匹配 i-> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
I=8,j=3 a b a b c a b c c a b c a c b a b
匹配失败 j-> a b c a c
i不动,j回溯到next[3],及j=1;
第四趟匹配 i-> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
I=8,j=3 a b a b c a b c c a b c a c b a b
匹配成功 j-> a b c a c
全部字符比较完毕;
#include<stdio.h>
#include <string.h>
void GetNext(char T[],int next[]){
int i,j,len;
next[0]=-1;
for(j=1;T[j]!='\0';j++)
{
for(len=j-1;len>=1;len--)
{
for(i=0;0<len;i++){
if(T[i]!=T[j-len+i])
break;}
if(i==len){
next[j]=len;