C++7.21

KMP算法是由Knuth、Morris和Pratt于1969年夏天提出的快速串匹配算法。它是由对BF算法的很大改进而成的,这主要体现在每当某趟匹配失败时,指针不必回溯,而是利用已经得到的“部分匹配结果”将模式向右滑动若干位置后得到。由于KMP算法避免了BF算法中频繁的回溯,普遍提高了模式匹配的工作效率,因此它又被称为“不回溯的字符串搜索算法”

KMP算法几乎可以在所有讲述算法的书中找到,之所以这个算法如此受到推崇(尽管它实际应用不如后面的BM算法),其中一个重要原因是它的发明者之一Knuth实在是太有名了。Donald E . Knuth于1938年1月10日出生在美国,他是数据结构与算法的奠基人,是这门科学的鼻祖。1963年。25岁的Knuth在加州理工学院获得其数学博士学位,同年开始着手撰写著名的《The Art of Computer Programming》一书,全书预计共7卷,该书的第一卷于1968年完成,目前已经出版了3卷。1974年,36岁的Knuth称为有史以来第9位图灵奖获得者,也是到目前为止最年轻的获得者,那年他36岁。

KMP算法正是基于这样的思想,算法在对字符串进行匹配前,先计算出模式字符串中各个字符的关系,然后再依据此关系对模式字符串与目标字符串进行匹配。

今天系统地学习了KMP算法 附原文链接

http://t.csdn.cn/EVyOm

写一个KMP

void KMP(int i,int j,char P[],char T[])
{
  int i=start,j=0;
  while(P[j]!='\0'&&T[i]!='\0')
   {
     if(j==-1||P[j]==T[i])
      {
        i++;
        j++;
      } 
      else j=next[j];
   }
if(T[j]=='\0') return(i-j);
else return -1;
}

 犹如醍醐灌顶 其实最核心的思想就是通过分析子串的最长前后缀 进行比对后,子串和母串相同部分拥有相同的前后缀,因此比对的时候直接跳到下一个后缀就可以了;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值