KMP略解

       KMP算法是一种用于字符串匹配的算法,这个算法的高效之处在于当在某个位置匹配不成功的时候可以根据之前的匹配结果从模式字符串的另一个位置开始,而不必从头开始匹配字符串

       PS:本来打算详细写的,但是打开电脑后突然不想打字了,就略写吧,可能是因为太菜吧。。    



      一  next函数

         在KMP算法中,为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的前缀。



二 next意义
  设在字符串S中查找模式串T,若S[m]!=T[n],那么,取T[n]的模式函数值next[n]
   1. next[n]= -1 表示S[m]T[0]间接比较过了,不相等,下一次比较 S[m+1] T[0]。
   2. next[n]=0 表示比较过程中产生了不相等,下一次比较 S[m] T[0]
   3. next[n]= k >0 表示,S[m]的前k个字符与T中的开始k个字符已经间接比较相等了,下一次比较S[m]T[k]相等

      三  如何求next函数

     按照递推的思想:

         根据定义next[0]=-1,假设next[j]=k, 即P[0...k-1]==P[j-k,j-1]

        1. 若P[j]==P[k],则有P[0..k]==P[j-k,j],很显然,next[j+1]=next[j]+1=k+1;

        2. 若P[j]!=P[k],则可以把其看做模式匹配的问题,即匹配失败的时候,k值如何移动,显然k=next[k]。

void getNext(char *p,int *next)
{
    int j,k;
    next[0]=-1;
    j=0;
    k=-1;
    while(j<strlen(p)-1)
    {
        if(k==-1||p[j]==p[k])    //匹配的情况下,p[j]==p[k]
        {
            j++;
            k++;
            next[j]=k;
        }
        else                   //p[j]!=p[k]
            k=next[k];
    }
}


     四  下面是运用Next的代码,和求next的代码大同小异
int KMPMatch(char *s,char *p)
{
    int next[100];
    int i,j;
    i=0;
    j=0;
    getNext(p,next);
    while(i<strlen(s))
    {
        if(j==-1||s[i]==p[j])
        {
            i++;
            j++;
        }
        else
        {
            j=next[j];       //消除了指针i的回溯
        }
       //  此处尽量不要这样写 1. 因为每一次都要调用strlen()函数相当耗时间  
       //  2.也不要写成str[k]='\0',因为会有k==-1过来
       //  提前len=strlen(str2),不要问我怎么知道的~~        
      if(j==strlen(p))                    
          return i-strlen(p);
     }
    return -1;
}


                                                                                                                                                                             -- Stay hungry Stay foolish. 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值