KMP算法实现

来源:互联网 发布:网络人肉违法 编辑:程序博客网 时间:2024/05/01 02:13
#include<iostream>using namespace std;void getnext(char *p, int next[ ]) {   next[0] = -1;  int j = 0, k = -1;  int len = strlen(p);  next[0] = -1;  while (j < len  )  {    if( k == -1 || p[k] == p[j]){  next[j+1] = k+1;  j++;k++;}else{  k = next[k];}  }}int KMP_help(char *T, char *P, int pos , int *next)    //返回模式串P在目标串T中的位置{   int len_P = strlen(P);   int len_T = strlen(T);   int i = pos, j = 0;   while (i < len_T && j < len_P)   {     if(j == -1) {   i++;j = 0; }     else if (P[j] == T[i]) {   i++;j++;  } else  {   j = next[j];  }   }        if(j < len_P ) return -1; else          return i -j;} int KMP(char *T, char *P, int pos = 0){ int count = strlen(P);  int *next = new int[count];    getnext(P,next);    int result = KMP_help(T,P,pos,next);   //  delete [] next;  //不知道为什么加上这个后,VC会报错,但编译能通过;Dev C++ 却没问题。  return result;}int main(){   char s1[20] = "xupengxjwhelloworld";   //主串  char s2[20] = "pengxjw";  cout<<KMP(s1,s2,0)<<endl;   return 0;}


重点是如何求解next数组。参考:点击打开链接。这篇对KMP的讲解,个人认为是最好的。

求解next过程中,理解递归是重点。

原创粉丝点击