KMP算法C++代码

26 篇文章 0 订阅

KMP算法的思想一般数据结构书都有讲,没讲的话google一下,有很多文章解释了其思想。晚上写了写这个代码,虽然不难,但还是费了番功夫调试,出现的主要问题有:无符号整型数据与整型数据比较大小(让我越来越讨厌无符号数!),还有一个问题就是KMP算法本身与求next数组的算法很类似,但是有些微妙的区别,也让调试了几次。

 

int *  GetNextVal( const   char   * s,  int   & len)
{
    len 
=  strlen(s);
    
int   * next  =   new   int [len];
    
int  i  =   0 ;
    
int  j  =   - 1 ;
    next[
0 =   - 1 ;
    
while (i < len - 1 ) // 注意这里跟KMP函数里面的不同
    {
        
if (j ==- 1   ||  s[i] == s[j])
        {
            
++ i;
            
++ j;
            next[i] 
=  j;
        }
        
else
        {
            j 
=  next[j];
        }
    }
    
return  next;
}

int  KMP( const   char   * s,  const   char   * t)
{
    
int  slen,tlen;
    
int  i,j;
    
int   * next  =  GetNextVal(t, tlen);
    slen 
=  strlen(s);
    i 
=   0 ;
    j 
=   0 ;
    
while (i < slen  &&  j < tlen)
    {
        
if (j ==- 1   ||  s[i] == t[j])
        {
            
++ i;
            
++ j;
        }
        
else
        {
            j 
=  next[j];
        }
    }

    delete[] next;

    
if (j == tlen)
        
return  i  -  tlen;
    
return   - 1 ;
}

int  main( int  argc,  char   * argv[])
{
    
char  s[ 128 ],t[ 128 ];
    
while (cin >> s >> t)
    {
        
int  pos1  =  KMP(s,t);
        
int  pos2  =  strstr(s,t)  -  s;
        cout
<< pos1 << " : " << pos2 << endl;
    }
    
return   0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值