字符串匹配(KMP算法)

以前学DS时没有搞懂KMP算法,后来KY又看了一遍,还是困惑,而如今静下心来啃了下,略感觉开了一点窍,书上的代码和算法思想看懂了,记录下来,以后备忘。。。

1

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+jts+m

 

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

 

 则立刻可以断定

               p0 p1 …pj-1  ¹ ts+1 ts+2 … ts+j

 

 下一趟必不匹配

2

同样,若       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-kpj 

 

                     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

 

3

k 的确定方法

    当比较到模式第 j 个字符失配时, k 的值与模式的前 j 个字符有关,与目标无关。

    利用失效函数 f (j)可描述。

 

利用失效函数 f (j) 的匹配处理

    如果 j = 0,则目标指针加 1,模式指针回到 p0

    如果 j > 0,则目标指针不变,模式指针回到 pf ( j-1)+1

4

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

 

 

 
 
 


示例 :确定失效函数 f (j)

 

 

 

 


int String::fastFind( String & pat ) const {
 int posP = 0, posT = 0;                             //两个串的扫描指针
 int lengthP = pat.curLen, lengthT = curLen;         //模式与目标串的长度
 while ( posP < lengthP && posT < lengthT )
  if ( pat.ch[posP] == ch[posT]) {
   posP++;
   posT++;
  }
  else {
    if (posP == 0)
        posT++;
    else
     posP = pat.f[posP -1] + 1;
  }

  if(posP < lengthP )
   return -1;                                  //匹配失败,说明posT比较完了不够length,而posT还剩
  else
   return posT - lengthP;                      //匹配成功   

}

 

至于f[j]怎么计算,明天早上头脑清醒了再研究,O(∩_∩)O~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值