int * CreateNextArray(char *str2,int nlen2) { int * next=(int *)malloc(sizeof(int)*nlen2); next[0]=-1; if(nlen2==1) { return next; } next[1]=0; int i=2; int cn=0; while(i<nlen2) { if(str2[i-1] == str2[cn]) { next[i++]=++cn; } else if(cn>0) { cn=next[cn]; } else { next[i++]=0; } } return next; } int KMP(char *str1,int nlen1,char *str2,int nlen2) { if(nlen2>nlen1 || nlen1<=0 || nlen2 <=0) return -1; int *next=CreateNextArray(str2,nlen2); // for(int i=0;i<nlen2;i++) // { // cout<<next[i]<<" "; // } cout<<endl; int i=0; int j=0; while(i<nlen1 && j<nlen2) { if(str1[i] == str2[j]) { i++; j++; } else if(next[j]<0) { i++; } else { j=next[j]; } } // cout<<i <<" "<<j<<endl; return j==nlen2 ? i-j:-1; }
原文:https://www.cnblogs.com/RainzzZ/p/12919411.html