数据结构KMP算法求Next[j]。设模式串pat='ABAAACDABAAACDA',求pat的Next[j]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构KMP算法求Next[j]。设模式串pat='ABAAACDABAAACDA',求pat的Next[j]相关的知识,希望对你有一定的参考价值。

void get_next(SString T,int next[])
//求模式串T的next函数值并存入数组next
i=1;
next[1]=0;
j=0;
while(j<T[0])

if(j==0 || T[i]==T[j])

++i;
++j;
next[i]=j;

else
j=next[j];

追问

不需要代码,我需要计算的出结果。

追答

011221112345678

追问

怎麽有些书是-10开始的?

追答

不知道,我看的严蔚敏 的书

追问

我知道了,如果模式串下标是从0开始的,那next[0]=-1,next[1]=0;而如果下标是从1开始的,那next[0]=0,next[1]=1;

参考技术A 011222112345678
和书上的答案对不上是吧

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[j]。设模式串pat='ABAAACDABAAACDA',求pat的Next[j]的主要内容,如果未能解决你的问题,请参考以下文章

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

跪求大神写一段代码,采用KMP算法,在主串中求模式串的next函数值!主串:abcabcd 模式串bcd!跪求.....

数据结构串---KMP模式匹配算法之获取next数组

KMP匹配算法

KMP字符串匹配算法

字符串之KMP算法求解next数组(C语言)