串的KMP匹配算法就是匹配字符串的时候指针主串指针不回溯。此算法主要是算出模式串每个字符应该移动的长度。在KMP算法中,为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的前缀。
// KMP算法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
int *KMP(char *str)
{
int len=strlen(str);
int *next=(int*)malloc(sizeof(int)*len);
next[0]=-1;
int i=0,k=-1;
while(i<len)
{
if(k==-1||str[i]==str[k])
{
i++;
k++;
next[i]=k;
}
else
{
k=next[k];
}
}
return next;
}
int macth(char* str,char *model)
{
int* next=KMP(model);
int i=0,j=0;
while (i<strlen(str))
{
if(j==-1||str[i]==model[j])
{
i++;
j++;
}
else
{
j=next[j];
}
if(j>0&&j>=strlen(model))
{
return i-strlen(model);
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char *str="abcabcacaba";
char *model="aca";
int *a=KMP(str);
for(int i=0;i<strlen(str);i++)
{
printf("%d\n",a[i]);
}
cout<<"--------"<<endl;
cout<<macth(str,model);
return 0;
}