KMP模板

来源:互联网 发布:php蜘蛛强制劫持跳转 编辑:程序博客网 时间:2024/05/17 22:36

next数组求法连接,感觉比较详细点击打开链接

kmp函数讲解,链接点击打开链接


#include<bits/stdc++.h>  using namespace std;  int next[200];    void GetNext(char *t,int lt)    //求next数组   {      int i=0,k=-1;      next[0]=-1;      while(i<lt-1)  // 根据已知的前j位推测第j+1位    {          if(k==-1||t[i]==t[k])          {              if(t[i+1]==t[k+1])                 next[++i]=next[++k];              else                  next[++i]=++k;          }          else              k=next[k];      }  }  int Kmp(char *s,int ls,char *t,int lt)  //返回值为下标  {      int i=0,j=0;      while(i<ls)      {          if(j==-1||s[i]==t[j])          {              ++i,++j;              if(j==lt)                  return i-j+1;          }          else              j=next[j];      }      return -1;      //不存在  }    int main()  {      char s[150],t[150];      while(true)      {          cout << "输入模式串:" ;          cin >> s;          cout << "\n" << "输入匹配串:";          cin >> t;                 int len_s=strlen(s);          int len_t=strlen(t);          GetNext(t,len_t);          int ans=Kmp(s,len_s,t,len_t);if(ans!=-1)          cout << "开始的位置为:" << ans << "\n" << endl;        else        cout << "未找到!\n" << endl;     }      return 0;  }