KMP入门

匿名 (未验证) 提交于 2019-12-02 23:49:02

#include <iostream> #include <cstring> using namespace std; char s[1000],p[1000];  inline int getans(char* s,char* p){     int sl=strlen(s),pl=strlen(p);     int i=0,j=0;     while(i<sl && j<pl){         if(s[i]==p[j])             i++,j++;         else{             i=i-j+1;             j=0;         }     }     if(j==pl) return i-j;     else return -1; }  int main(){     cin>>s>>p;     int ans=getans(s,p);     cout<<ans<<endl;     return 0; }

 

inline int KMPsearch(char* s,char* p){     int sl=strlen(s),pl=strlen(p);     int i=0,j=0;     while(i<sl && j<pl){         if(s[i]==p[j]||j==-1)//j==-1表示匹配成功,进行后续的字符匹配             i++,j++;         else             j=nxt[j];//i不用变,j直接跳到预处理好的next[j]处     }     if(j==pl) return i-j;     else return -1; }

 

1.

2.

 

 如果相等,则该位的next值就是前一位的next值加上1;

 

 如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。

 

 3.

 

inline void GetNext2(char *p,int nxt[]){     int pl=strlen(p);     nxt[0]=-1;     int k=-1;     int j=0;     while(j<pl-1){         if(k==-1 || p[j]==p[k]){             ++j,++k;             if(p[j]!=p[k])                 nxt[j]=k;             else nxt[j]=nxt[k];         }         else k=nxt[k];     } }

 Third.对于next数组的优化:

 

Finally.整体代码(可直接食用哦):

 

#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std;  char s[100],p[100]; int nxt[100];  inline void GetNext2(char *p,int nxt[]){     int pl=strlen(p);     nxt[0]=-1;     int k=-1;     int j=0;     while(j<pl-1){         if(k==-1 || p[j]==p[k]){             ++j,++k;             if(p[j]!=p[k])                 nxt[j]=k;             else nxt[j]=nxt[k];         }         else k=nxt[k];     } }  inline int KMPsearch(char* s,char* p){     int sl=strlen(s),pl=strlen(p);     int i=0,j=0;     while(i<sl && j<pl){         if(s[i]==p[j]||j==-1)             i++,j++;         else             j=nxt[j];     }     if(j==pl) return i-j;     else return -1; }  int main(){     cin>>s>>p;     GetNext2(p,nxt);     int ans=KMPsearch(s,p);     cout<<ans<<'\n';     return 0; }

 

 嗯,真香

 

转载请标明出处:KMP入门
文章来源: KMP入门
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!