KMP算法(具体求串的next[n])

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}


以上是关于KMP算法(具体求串的next[n])的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-串手算KMP算法的next和nextval数组

KMP算法NEXT数组计算方法

KMP算法NEXT数组计算方法

KMP算法

KMP字符串匹配算法详解

KMP算法