让编程改变世界
Change the world by program
http://blog.fishc.com/2303.html
KMP算法之最终实现及优化
搞定了NEXT数组,KMP算法就易如反掌了。
一起来完成:kmp.c
KMP模式匹配算法改进
后来有人发现,KMP算法是有缺陷的。比如我们的主串 S =“aaaabcde”,子串 T =“aaaaax”,其中很容易得到next数组为012345。
那么我们看以下比较图:
上述NEXT数组为 0 1 2 3 4 5
但上述数组不科学,效率不高。NEXT要回溯到底:
NEXT 数组为 0 0 0 0 0 5
也就是在C语言以0为标号开始的处理方式中
NEXT -1 -1 -1 -1 -1 4
总和之前所有代码有如下的实现完整的KMP算法:
#define N 100
int next[N];
int getNext(char *des)
{
int i;//i为串的后缀
int j;//j为串的前缀
i=0;
j=-1;
next[i]=-1;
while(i<strlen(des)-1)
{
if(j==-1||des[i]==des[j])
{
i++;j++;//前缀和后缀后移
//next[i]=j;//无优化
if(des[i]!=des[j])
{
next[i]=j;
}
else
next[i]=next[j];//回溯到底
}
else
{//前缀回溯
j=next[j];
}
}
return i;
}
int index_KMP(char* src,char* des)
{
int i;//src索引
int j;//des 模式串的索引
i=0;j=0;
getNext(des);
while(i<(int)strlen(src)&&j<(int)strlen(des))
{
if(j==-1||src[i]==des[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
int t=strlen(des)-1;
if(j>t)
{
return i-j;
}
return -1;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* des=new char[100];
char* str="aaaaax";
strcpy(des,str);
char* src=new char[100];
char* strt="abababacaabacc";
strcpy(src,strt);
int index=index_KMP(src,des);
if(index!=-1){
for(int i=0;i<=strlen(des)-1;i++)
{
printf("%c",src[i+index]);
}
}
else
{
printf("not Find");
}
printf("\n");
return 0;
}