1. RK算法
#include<iostream> #include<vector> #include<string> using namespace std; const int d=26; const int q=144451; void RK(string T, string P) { int n=T.size(); int m=P.size(); int h=1; for(int i = 0;i<m-1;i++) h = (h*d) % q; int p=0, t=0; for(int i=0; i<m; i++) { p=(d*p+P[i]-'a')%q; t=(d*t+T[i]-'a')%q; } for(int i=0; i<=n-m; i++) { if(p==t) { int tt=0; for(int j=i; j<i+m; j++) { if(T[j]==P[j-i]) tt++; else break; } if(tt==m) cout<<"pattern occur with shift: "<<i<<endl; } if(i<n-m) t=(d*(t-(T[i]-'a')*h%q+q)+T[i+m]-'a')%q;//这块要注意 } return ; } int main() { string a="assfssagdasasfssaggdasfssagsd"; string b="asfssag"; RK(a,b); system("pause"); return 0; }
2. KMP算法
#include<iostream> #include<vector> #include<string> using namespace std; void kmp(string a, string b) { int m=a.size(), n=b.size(); if(m==0 || n==0 || m<n) return; int *next=new int[n+1](); next[1]=0; int j=1,k=0; while(j<n) { if(k==0 || b[j-1]==b[k-1]) { k++; next[++j]=k; } else k=next[k]; } int *nextval=new int[n+1](); nextval[1]=0; j=2; while(j<n+1) { k=next[j]; if(b[j-1]==b[k-1]) { nextval[j]=nextval[k]; } else { nextval[j]=next[j]; } j++; } for(int i=0;i<n;i++) nextval[i]=nextval[i+1]; j=0; for(int i=0; i<m; i++) { if(a[i]!=b[j]) { j=nextval[j]; continue; } if(a[i]==b[j]) j++; if(j==n) { cout<<"find at pos:"<<i-j+1<<endl; j=1; } } delete []next; delete []nextval; } int main() { //string a="aaabaaabaaaabaaaaabaab"; //string b="aaaab"; string a="dssfssagdasasfssaggdasfssagsd"; string b="asfssag"; kmp(a,b); system("pause"); return 0; }