[时空权衡]字符串匹配KMP算法代码(引自算法导论)

这里只贴一份来自《算法导论》的伪代码改写的代码。
void KMP_prefix( const char *t, int * next )
{
     
int len =
strlen(t) ;
     
int i, j = -1
;
      next[
0] = -1
;
     
//请读者自行思考i什么时候增长

     for( i=1; i<len; ++ i )
      {  
    
//
i永远和j+1位的比较(因为j初始值为-1)
    
//如果失配就执行跳转。直到j为-1为止。

         while( (j+1>0)&&(t[j+1]!= t[i]) )
              j
=
next[j] ;
    
//如果匹配,则两个串的指针都增长

         if( t[j+1]== t[i] )
             
++
j ;
    
//
这句很抽象,意思是:
    
//
跳转的位置永远是匹配成功的下一位
    
//也是唯一给跳转表赋值的一句

          next[i] = j+1 ;
      }
}

//主函数:可以看出这个函数与上面的函数极其相似

int KMP_matcher( const char *s, const char *t, int beg )
{
     
int l1 = strlen(s), l2 =
strlen(t) ;
     
int *next = new int
[l2] ;
      KMP_prefix( t, next ) ;
     
int i, j = -1, ans =
beg ;
     
for( i=beg; i<l1; ++
i )
      {
         
while( (j+1>0)&&(t[j+1]!=
s[i]) )
          {
              j
=
next[j] ;
          }
         
if( t[j+1]==
s[i] )
          {
             
++
j ;
          }
         
if( j+1==
l2 )
          {
              ans
= i-l2+1
;
             
break
;
          }
      }
     
return
ans ;
}

转载于:https://www.cnblogs.com/microgrape/archive/2011/05/12/2043927.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值