重拾KMP

来源:互联网 发布:逆战刷枪软件截图 编辑:程序博客网 时间:2024/04/28 05:46

今天重新把KMP看了一下。

这个博客讲的不错,马克之。

点击打开链接


#include<iostream>#include<cstring>#include<string>using namespace std;string Pattern;string Text;int next[1000];void get_nextval()//获取next的函数,有点动态规划的感觉 {   int j=0,k=-1;   int n=Pattern.length();   next[0]=-1;   while(j<n)   {      if(k==-1||Pattern[j]==Pattern[k])//如果去掉k==-1这段,剩下比较容易理解。k==-1设计的比较巧妙       {         j++;         k++;         if(Pattern[j]!=Pattern[k])            next[j]=k;         else            next[j]=next[k];      }      else         k=next[k];   }}int KMP() {get_nextval();int index,i=0,j=0;int N=Text.length();int n=Pattern.length();while(i<N&&j<n){if(Text[i]==Pattern[j]){++i;++j;}else{index=i-next[j];if(next[j]!=-1)j=next[j];else{j=0;i++;}}}if(j=n-1)return index;// 匹配成功elsereturn -1;      }int main()//abCabCad{Text="0123456789adCadCadasaasdadf";    Pattern="adCadCad";  cout<<KMP()<<endl;   return 0;}


0 0