字符串匹配——KMP算法
KMP(Knuth-Morris-Pratt)算法分两部分,先计算Next[]数组,然后进行串匹配。
KmpNext算法描述如下:
输入:样本串P[0..m-1],m为样本长度。
输出:数组Next[0..m-1],即Next函数值。
void KmpNext(char P[],int m,int&Next[]){
int i,j;
Next[0]=-1;
for(i=1; i<m; i++){
j=Next[i-1];
while(P[j+1]!=P[i]&&(j>=0))
j=Next[j];
if(P[i]==P[j+1])
Next[i]=j+1;
else
Next[i]=-1;
}
}
计算完Next[]数组后,进行串匹配。
KmpStringMatch
算法描述如下:
输入:样本P[0..m-1],(m>0),文本T[0..n-1],Next[0..m-1].
输出:P在T中第一次出现的首元下标,如果没有匹配则输出“Failure”。
void KmpStringMatch(char[]P,char[]T,int m, int n, int[] Next){
int i=j=0;
while(i<=n-m+1){总共尝试//匹配n-m+1次
while((j>=0)&&(P[j])!=T[i])
j=Next[j];
if(j==m-1){
cout<<i<<endl;
return;
}
else{
i++;
j++;}
}
cout<<"Failure"<<endl;
return;
}