标签:kmp
MP模板:
/* MP算法 */ void getFail(int* P,int* f)//失配函数 { f[0]=f[1]=0; for(int i=1; i<m; i++){ int j=f[i]; while(j&&P[i]!=P[j]){ j=f[j]; } f[i+1]=(P[i]==P[j]?j+1:0); } } int Find(int* T,int* P,int* f)//匹配函数 { getFail(P,f); int j=0; for(int i=0; i<n; i++){ while(j&&P[j]!=T[i]){ j=f[j]; } if(P[j]==T[i]){ j++; } if(j==m){ return i-m+1; } } return -1; }KMP模板:
/* KMP */ int kmpmatch(int aa[],int bb[]){ int i=0,j=0; int slen=a; int plen=b; while(i<slen&&j<plen) { //①如果j = -1,或者当前字符匹配成功(即aa[i] == bb[j]),都令i++,j++ if(j==-1||aa[i]==bb[j]) { i++; j++; } else { //②如果j != -1,且当前字符匹配失败(即aa[i] != bb[j]),则令 i 不变,j = Next[j] //Next[j]即为j所对应的Next值 j=Next[j]; } } if(j==plen) return i-j+1; else return -1; } //递推求得Next数组,代码如下所示: void getNext(int bb[],int Next[]){ int plen=b; Next[0]=-1; int pre=-1;//前缀 int last=0;//后缀 while(last<plen-1){ if(pre==-1||bb[last]==bb[pre]){ ++last; ++pre; if(bb[last]!=bb[pre]) Next[last]=pre; else Next[last]=Next[pre]; } else{ pre=Next[pre]; } } }
标签:kmp
原文地址:http://blog.csdn.net/u013050857/article/details/45503735