kmp算法 Posted on 2018-11-04 | In c++ | kmp 模式匹配 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768#include <iostream>#include<string.h>int n,m;int prefix[100];using namespace std;void prefix_table(char patt[],int n){ prefix[0]=0; int i=1; int len=0; while(i<n){ if(patt[i]==patt[len]) { len++; prefix[i]=len; i++; } else{ if(len>0) len=prefix[len-1]; else{ prefix[i]=len; i++; } } }}void move_prefix(int prefix[],int n){ for(int i=n-1;i>0;i--) prefix[i]=prefix[i-1]; prefix[0]=-1;}void kmp(char txt[],char patt[]){ prefix_table(patt,n); move_prefix(prefix,n); int i=0,j=0; m=strlen(txt); while(i<m){ if(j==n-1&&txt[i]==patt[j])//!! { // cout<<i<<endl; // cout<<j<<endl; cout<<"Found at:"<<i-j<<endl; j=prefix[j]; // cout<<"j:"<<j; } if(txt[i]==patt[j]){ i++;j++; } else{ j=prefix[j]; if(j==-1){ i++; j++; } } }}int main(){ char patt[100]; strcpy(patt,"BABA"); n=strlen(patt); char txt[100]; strcpy(txt,"ABABABA"); kmp(txt,patt);}