#include<iostream> #include<cstring> using namespace std; //返回字符数组p的每一位的最长公共字串的位置 int* Next(char* p){ int tmplen=strlen(p); int* N=new int[tmplen]; N[0]=0; for(int i=1;i<tmplen;i++){ int k=N[i-1]; while(k>0&&p[i]!=p[k]) k=N[k-1]; if(p[i]==p[k]) N[i]=k+1; else N[i]=0; } return N; } int KMP_Find(char* s,char* p,int* N){ int i; int j=0; for(i=0;i<strlen(s);i++){ while(p[j]!=s[i]&&j>0) j=N[j=1]; if(p[j]=s[i]) j++; if(j==strlen(p)) return i-j+1; } return -1; } int main(){ char s[50]="abababacabaaa"; char p[50]="bac"; cout<<strlen(s)<<" "<<strlen(p)<<endl; int* N=new int[strlen(p)]; N=Next(p); cout<<KMP_Find(s,p,N)<<endl; system("PAUSE"); return 0; }