zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    【css基础修炼之路】— 谈谈元素的垂直水平居中
    git在linux安装步骤详解!!
    idea :不支持发行版本11问题
    centos7 升级gcc
    mysql--优化
    Docker安装
    使用idea从零编写SpringCloud项目-zuul
    使用idea从零编写SpringCloud项目-Hystrix
    使用idea从零编写SpringCloud项目-Feign
    使用idea从零编写SpringCloud项目-Ribbo
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5179558.html
Copyright © 2011-2022 走看看