KMP算法(詳細求串的next[n])

 怎麼求串的模式值next[n]

 

1next[0]= -1  意義:任何串的第一個字符的模式值規定爲-1


2next[j]= -1   意義:模式串T中下標爲j的字符,如果與首字符

相同,且j的前面的1—k個字符與開頭的1—k

個字符不等(或者相等但T[k]==T[j])(1k<j)。

如:T=”abCabCad”  next[6]=-1,因T[3]=T[6]


3next[j]=k    意義:模式串T中下標爲j的字符,如果j的前面k

字符與開頭的k個字符相等,且T[j] != T[k] 1k<j)。

T[0]T[1]T[2]。。。T[k-1]==T[j-k]T[j-k+1]T[j-k+2]…T[j-1]

T[j] != T[k].1k<j;


(4) next[j]=0   意義:除(1)(2)(3)的其他情況。


#include <iostream.h>
//#include <string.h>
 


void get_nextval(const char *T, int next[] )
{
       // 求模式串T的next函數值並存入數組 next。
       int j = 0, k = -1;
       next[0] = -1;
       while ( T[j] != '\0' )
       {
              if (k == -1 || T[j] == T[k])
              {
                     ++j;
					 ++k;
                     if (T[j]!=T[k])
                            next[j] = k;
                     else
                            next[j] = next[k];
              } 
              else
                     k = next[k];
       } 
    // 這裏是我加的顯示部分
    for(int  i=0;i<j;i++)
       {
            cout<<next[i]<<endl;
       }
       cout<<endl;
} 
  
///////////////////////////////////////////////////////////
int KMP(const char *Text,const char* Pattern) 
 
{
       if( !Text||!Pattern||  Pattern[0]=='\0'  ||  Text[0]=='\0' ) 
              return -1;//空指針或空串,返回-1。
       int len=0;
       const char * c=Pattern;
       while(*c++!='\0') 
       {    
              ++len;  
       }
       int *next=new int[len+1];
       get_nextval(Pattern,next);//求Pattern的next函數值
   
       int index=0,i=0,j=0;
       while(Text[i]!='\0'  && Pattern[j]!='\0' )
       {
              if(Text[i]== Pattern[j])
              {
                     ++i; 
                     ++j;
              }
              else
              {
                     index += j-next[j];
                     if(next[j]!=-1)
                            j=next[j];// 模式串向右移動
                     else
                     {
                            j=0;
                            ++i;
                     }
              }
       } 
   
       delete []next;
       if(Pattern[j]=='\0')
              return index;// 匹配成功
       else
              return -1;      
}
int main() 
{
       char* text="babadCadCaaaaa";
       char*pattern="adCad";
         
      cout<<KMP(text,pattern)<<endl;
       return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章