/************************************************************************ * 函数名: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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。