sunjunior 2020-06-26
1.目的
在主串中快速,快速,快速地找到目标串
2.求解next数组
void getNext(StrNonfix substr,int next[]){ int j=1,t=0; next[1]=0; while(j<substr.length){ if(t==0||substr.ch[j] == substr.ch[t]){ next[j+1]=t+1; ++t; ++j; }else{ t=next[t]; } } }
3.KMP算法
int KMP(StrNonfix str,StrNonfix substr,int next[]){ int i=1,j=1; while(i<=str.length && j<=substr.length){ if(j==0||str.ch[i] == substr.ch[j]){ ++i; ++j; }else{ j=next[j]; } } //模式串在主串中的初始位置 if(j>substr.length){ return i-substr.length; }else{ return 0; } }
4.改进
对KMP算法的改进主要体现在对Next数组的改进上
这里假设Pd,Pc,Pb都与Pj相同,Pa与Pj不同。
1.当Pk不等于Pj时,nextval[k]=next[k]=j;
2.当PK等于Pj时候,nextval[k]=nextval[next[k]]=nextval[j];
void getNextval(StrNonfix substr,int nextval[]){ int j=1,t=0; nextval[1]=0; while(j<substr.length){ if(t==0||substr.ch[j] == substr.ch[t]){ if(substr.ch[j+1] !=substr.ch[t+1]){ nextval[j+1]=t+1; }else{ nextval[j+1]=nextval[t+1]; } ++t; ++j; }else{ t=nextval[t]; } } }