字符串匹配——KMP算法

来源:互联网 发布:楠木鞋架淘宝 编辑:程序博客网 时间:2024/06/05 20:18

字符串匹配——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;}