KMP匹配算法的实现

  KMP匹配算法是用于匹配字符串的经典算法,对KMP的详解或教程我就不写了,自认写不好。推荐两个自己认为不错的链接给想了解的朋友:

    1、介绍的很详细:http://www.cppblog.com/oosky/archive/2006/07/06/9486.html

    2、看大多数教程都理解不了KMP的同学,看下这篇:http://www.kuqin.com/algorithm/20080721/11844.html

 

  贴上我的代码吧,C++实现。

 

#include <iostream>
using namespace std;

//next生成函数
void KMP_next(int *next,const char * t)
{
  int i =0;
  int j =-1;
  next[0] =-1;
  const int tlen =strlen(t);
     while(i<tlen-1)
  {  
      if(j==-1 || t[i]==t[j])
     {
     j++;i++;next[i] =j;
     }
      else
     {
        j=next[j];
     }
   }
}
//匹配函数
int  KMP(const char * src, const char* t)
{
   const int slen=strlen(src);
   const int tlen=strlen(t);
   int *next = new int[tlen];
   KMP_next(next, t);

   int i =0,j=-1;
    while(i<slen&&j<tlen)
    {
        if(j==-1 || src[i] ==t[j])
            i++,j++; 
        else
            j = next[j];
    }
    if(next)
        delete []next;
    if(j>=tlen)
        return (i-j);
    else 
        return -1;
}


int main()
{
    char src[15] ="ababdababababe";
    char t[6] ="ababe";
    cout<<KMP(src,t)<<endl;
 
    system("pause");
    return 0;
}

对于会的朋友来说,代码比较清晰了,很容易懂,对于还没理解的同学,可能仅看代码不容易看出头绪!可以看看别的详解之类的文章!

  这里需要提一点,就是在调试程序的过程(VS2010),delete []next 的时候总是崩溃,后来找到原因是访问next数组的时候越界了,但不明白的是越界访问怎么会影响到后来的delete操作,我的猜想是:在new int[MAX]时,分配的空间不止MAX个单位大小,会在其后增加些许信息,delete释放内存时,会使用这些信息。由于越界访问将这些“信息”擦除了,所以会导致delete的失败。

  不过对于这一猜想还需要继续验证,如果有朋友了解,望赐教! 当然,上面的程序已经将越界问题优化掉了!

  仅以此文记录学习路程及对自己的鼓励!

 

转载于:https://www.cnblogs.com/wangfugen/archive/2013/03/19/2970196.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值