我是靠谱客的博主 洁净抽屉,最近开发中收集的这篇文章主要介绍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] != '' )
       {
              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]==''  ||  Text[0]=='' ) 
              return -1;//空指针或空串,返回-1。
       int len=0;
       const char * c=Pattern;
       while(*c++!='') 
       {    
              ++len;  
       }
       int *next=new int[len+1];
       get_nextval(Pattern,next);//求Pattern的next函数值
   
       int index=0,i=0,j=0;
       while(Text[i]!=''  && Pattern[j]!='' )
       {
              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]=='')
              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[n])所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部