《数据结构》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, 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++;  
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;  
 }  

你可能感兴趣的:(《数据结构》KMP实现)