设为首页 加入收藏

TOP

数据结构——KMP算法C++版
2012-12-06 13:52:57 来源: 作者: 【 】 浏览:336
Tags:数据结构 KMP 算法

  [cpp]

  #include "stdafx.h"

  #include <iostream>

  using namespace std;

  void get_next(char*t, int next[ ]){

  int t_len=strlen(t);

  int i=0;         //求解每个next[i]

  next[0]=-1; //递推基本条件,然后求解next[i+1]

  int j=-1;     //向后递推位置下标

  /*

  next[i]=k =>T0...Tk-1=Ti-k...Ti-1

  求解next[i+1]

  1> 如果T0..Tk-1Tk=Ti-k...Ti-1Ti=>next[i+1]=k+1=next[i]+1;

  2>Tk<>Ti,next[k]=k', 如果Ti=Tk'=>next[i+1]=k'+1=next[k]+1=next[next[i]]+1;

  3>依次递推 最后情况next[i+1]=next[0]+1=0,即

  */

  while(i<t_len)

  {

  if(j==-1 ||t[i]==t[j])  //j==-1证明已经与t[0]不匹配了,此时next[i+1]=0

  {

  i++;

  j++;

  next[i]=j;

  }

  else

  {

  j=next[j];

  }

  }

  }

  int KMP(char *s,char *t){

  int s_len=strlen(s);

  int t_len=strlen(t);

  int i=0;

  int j=0;

  int *next=new int[t_len];

  get_next(t,next);

  if(t_len>s_len) return -1;

  while(i<s_len&&j<t_len){

  if(j==-1||s[i]==t[j]){

  i++;

  j++;

  }

  else{

  j=next[j];

  }

  }//end while

  if(j>=t_len)

  return i-j;

  else

  return -1;

  }

  int main(void)

  {

  char *s="abcdasdefghijklmnefgh";

  char *t="efgh";

  cout<<KMP(s,t)<<endl;

  return 0;

  }

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据结构--关于线性表插入元素 下一篇c++ map, mutimap删除..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: