《数据结构》KMP实现

前端之家收集整理的这篇文章主要介绍了《数据结构》KMP实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
/************************************************************************ * 函数名:KMP * * 函数功能:使用KMP算法进行字符串匹配 返回结果:返回模式串在主串中的位置 参 数:主串,模式串 * * 创 建: 2014/3/20 * * 版本号:1.0 注:由于字符数组的下标0可用,求出的next[0],nextval[0]均从-1开始 (《数据结构》从0开始),数组的每个元素均少1,但所求结果正确。 ************************************************************************/ #include <iostream> using namespace std; void get_next(char*t,int next[ ]){ int t_len=strlen(t); int i=0; //求解每个next[i] next[0]=-1; //递推基本条件,然后求解next[i+1] int j=-1; //向后递推位置下标 /* next[i]=k =>T0...Tk-1=Ti-k...Ti-1 求解next[i+1] 1> 如果T0..Tk-1Tk=Ti-k...Ti-1Ti=>next[i+1]=k+1=next[i]+1; 2>Tk<>Ti,next[k]=k',如果Ti=Tk'=>next[i+1]=k'+1=next[k]+1=next[next[i]]+1; 3>依次递推 最后情况next[i+1]=next[0]+1=0,即 */ while(i<t_len) { if(j==-1 ||t[i]==t[j]) //j==-1证明已经与t[0]不匹配了,此时next[i+1]=0 { i++; j++; next[i]=j; } else { j=next[j]; } } } void get_nextval(char*t,即 */ while(i<t_len) { if(j==-1 ||t[i]==t[j]) //j==-1证明已经与t[0]不匹配了,此时next[i+1]=0 { i++; j++; if(t[i]!=t[j]) next[i]=j; else next[i]=next[j]; } else { j=next[j]; } } } int KMP(char *s,char *t){ int s_len=strlen(s); int t_len=strlen(t); int i=0; int j=0; int *next=new int [t_len]; get_next(t,next); /* for (int me=0;me<t_len;me++) cout<<next[me]<<endl; */ if( t_len >s_len ) return -1; while(i < s_len && j<t_len ) { if(j==-1 || s[i]==t[j]) { i++; j++; } else { j=next[j]; } }//end while if( j>=t_len ) return i- t_len; else return -1; } int main(void) { char *s= "cdabaabc"; char *t= "abaabc"; cout<< KMP(s,t) <<endl; return 0; }

猜你在找的数据结构相关文章