KMP模式匹配算法以及普通模式匹配算法

来源:互联网 发布:那些淘宝客公司 编辑:程序博客网 时间:2024/05/17 21:47

/////////////////////////////////////////////////////////////////////////////////////////////
// if return value == -1 ;the indexSubStr is not exist;
// else the indexSubStr is exist.
////////////////////////////////////////////////////////////////////////////////////////////
int IndexSubStr(char* subStr,char* str,int pos=0)
{
 if( (subStr==NULL)||(str==NULL)||(pos<0) )
  return -1;

 int lenStr  = 0;
 int lenSubStr = 0;


 char* ptr  = subStr;
 while( *ptr!='/0' )
 {
  ++lenSubStr;
  ++ptr;
 }
 //printf("lenSubStr = %d/n",lenSubStr);

 

 ptr = str;
 while( *ptr!='/0' )
 {
  ++lenStr;
  ++ptr;
 }
 
 //printf("lenStr = %d/n",lenStr);


 if( (pos>=lenStr)||(lenSubStr==0)||(lenStr<lenSubStr) )
  return -1;


 int j = 0;
 int num = 0;
 while( (pos<lenStr)&&(j<lenSubStr) )
 { 
  ++num;
  if( str[pos]==subStr[j] ){ ++pos;++j;}
  else{ pos = pos - j + 1; j = 0;}  
 }
 printf("IndexSubStr: num = %d/n",num);

 if( j==lenSubStr )
  return pos-lenSubStr;
 else 
  return -1;

 
}

 

 

bool GetNext(char* str,int next[],int lenNext=1)
{
 if( (str==NULL)||(next==NULL)||lenNext<1 )
  return false;

 int lenStr = 0;
 char* pStr = str;
 while( pStr[lenStr]!='/0' )
  ++lenStr;
 --lenStr;

 if( lenStr>lenNext )
  return false;
 
 
 int i = 0;
 int j = -1; 
 next[0] = -1;

 //printf("text[%d] = %c, next[%d]=%d/n",i,str[i],i,next[i]);
 while(i<lenStr)
 {

  if( (j==-1)||(str[i]==str[j]) )
  { 
   ++i;
   ++j;
   if( str[i]!=str[j] ) next[i] = j;
   else next[i] = next[j];
   //printf("text[%d] = %c, next[%d]=%d/n",i,str[i],i,next[i]);
  }  
  else
  { 
   j = next[j]; 
  }
 }

 return true;
}


//////////////////////////////////////////////////////////////////////////
// if return value == -1 ;the indexSubStr is not exist;
// else the indexSubStr is exist!
//////////////////////////////////////////////////////////////////////////
int IndexSubStrKMP(char* subStr,char* str,int pos=0)
{
 if( (subStr==NULL)||(str==NULL)||(pos<-1) )
  return -1;
 
 int  lenStr = 0;
 char* pStr = str;
 while( pStr[lenStr]!='/0' )
  ++lenStr;
 if( lenStr==0 )
  return -1;

 int lenSubStr = 0;
 pStr = subStr;
 while( pStr[lenSubStr]!='/0' )
  ++lenSubStr;
 if(lenSubStr==0)
  return -1;

 int* arrayNext = new int[lenSubStr];
 if( arrayNext==NULL )
  return -1;
 memset(arrayNext,0,lenSubStr*sizeof(int));
 if( !GetNext(subStr,arrayNext,lenSubStr) )
  return -1;

 


 int num = 0;
 int j = 0;
 while( (pos<lenStr)&&(j<lenSubStr) )
 {
  ++num;
  if( str[pos]==subStr[j] ){ ++pos; ++j; }
  else
  {
   if( arrayNext[j]==-1 ){ ++pos;j=0; }
   else j = arrayNext[j];
   
  }
 }
 printf("IndexSubStrKMP: num = %d/n",num);

 if( arrayNext!=NULL )
  delete[]arrayNext;

 if( j==lenSubStr )
  return pos-lenSubStr;

 return -1;
}

 

 

 

 


原创粉丝点击