KMP算法的思路为:S为目标串,T为模式串,若S[i] = T[j],则i和j分别增1,否则,i不变j退回到j = next[j]的位置,这是的j可能出现两种情况:一种是j退回到某个j=next[j]位置时有S[i] = T[j],则指针各增1后继续匹配;另一种情况是j退回到j = -1时,此时令I,j指针各增1,即下一次比较S[I + 1]和T[0]。可是还是不太懂next数组是怎么回事,如果有高手能帮忙解释下,小弟在这里先谢谢了。
下面代码大部分来自课本:
#include
using namespace std;
void getNext(char T[],int next[])
{
//next数组用来保存next数组的值
//T数组是T模式串
int j,k;
j = 0;
k = -1;
next[0] = -1;
int length = strlen(T);
while(j < length - 1)
{
if(k == -1 || T[j] == T[k])
{
j++;
k++;
next[j] = k;
}
else k = next[k];
}
}
int TestKMP(char T[],char S[])
{
int i,j;
int next[50];
getNext(T,next);
i = j = 0;
int s_length = strlen(S);
int t_length = strlen(T);
while(i < s_length && j < t_length)
{
if( j == -1 || S[i] == T[j])//如果next数组中出现了-1或者S[i]和T[j]匹配
{
i++;
j++;
}
else j = next[j];//否则让S[i]和T[ (next[j]) ]比较是否匹配
}
if(j >= t_length)//比较匹配次数大于或等于T串的长度,说明匹配成功
{
return (i - t_length + 1);//返回匹配开始的位置,因为数组是从0开始的,所以加1
}
else return (-1);
}
void main()
{
int next[20] = {0};
char T[20],S[50];
cout<<"请输入T串和S串"<<endl;
cin>>T>>S;
int location =TestKMP(T,S);
if(location > 0)cout<<"匹配成功,位置在"<<location<<endl;
else cout<<"匹配不成功"<<endl;
}
如果你发现了代码的错误和不足,欢迎指出。