KMP 失配函数

//求子模板串的模式值f[n]的函数

//f[i]表示以i为下标的字符前边有几个跟开头重复的字符

void getFail(char *p, int *f)

{

    int m=strlen(p);

    f[0]=f[1]=0;

    for(int i=1; i<m; ++i)

    {

        int j=f[i];

        while(j && p[i]!=p[j])j=f[j];

        f[i+1] = p[i]==p[j]?1+j:0;

    }

}

T    t0  t1  … ts-1  ts  ts+1  ts+2  …  ts+j-1  ts+j  ts+j+1  … tn-1
                           ‖  ‖  ‖         ‖    ‖    
 P                  p0  p1   p2    …  pj-1    pj      pj+1


 则有       ts ts+1 ts+2 … ts+j = p0 p1 p2 …pj          (1)


 为使模式 P 与目标 T 匹配,必须满足
 p0 p1 p2 …pj-1 …pm-1  = ts+1 ts+2 ts+3 … ts+j … ts+m


 如果       p0 p1 …pj-1   p1 p2 …pj           (2)


 则立刻可以断定
          p0 p1 …pj-1   ts+1 ts+2 … ts+j


 下一趟必不匹配

同样,若   p0 p1 …pj-2   p2 p3 …pj


则再下一趟也不匹配,因为有


p0 p1 …pj-2   ts+2 ts+3 … ts+j


直到对于某一个“k”值,使得


                  p0 p1 …pk+1   pj-k-1 pj-k …pj  


且                     p0 p1 …pk = pj-k pj-k+1 …pj


      p0 p1 …pk = ts+j-k ts+j-k+1  … ts+j
                                    ‖    ‖          ‖
           pj-k   pj-k+1   …  pj

k 的确定方法
    当比较到模式第 j 个字符失配时, k 的值与模式的前 j 个字符有关,与目标无关。
    利用失效函数 f (j)可描述。


利用失效函数 f (j) 的匹配处理
    如果 j = 0,则目标指针加 1,模式指针回到 p0。
    如果 j > 0,则目标指针不变,模式指针回到 pf(j-1)+1。 

若设  模式  P = p0 p1…pm-2 pm-1

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值