关于KMP的一些个人理解

KMP算法需要大量的时间来研究,当然,会了之后基本上就感觉很简单了。本文就是大致讲一下我在学习kmp的过程中的一些感悟和理解吧。

 

首先,还不了解kmp的可以先看一下别的大牛的博客,例如http://www.cppblog.com/oosky/archive/2006/07/06/9486.html,了解一下kmp的基本原理以及它的优越性在哪。

 

其次,KMP中有个next函数,这就是KMP的核心。它有两个版本http://www.cnblogs.com/destinydesigner/archive/2009/10/17/1585063.html  ,每个版本的话next[]表示的意义不同                                   我所学习的是第二个版本的next数组。表示的是如果第i位的t[i]开始与s[i]不匹配了(即前面i-1为都和S数组匹配),下面一步就把s[i]与t[next[i]]相比较。   而这个版本的话,注意next[n]是存在的,n是t[]数组的长度,不存在t[n]但是存在next[n],因为next[n-1]是不包括t[n-1]在内,而为了解决这个问题,所以只能增加一个next[n],这样的话next[n]就能包括t[n-1]位了.         其次next[j]=k   意义:模式串T中下标为j的字符,如果j的前面(不包括t[j])k字符与开头的k个字符相等                      (next[]函数那一段程序,如果先不理解,可以记着)

 

再其次,kmp中一般有三种题型。一种是求最小匹配子串,一种是求最小覆盖子串,另一种就是kmp匹配算法。

第一种求最小匹配子串,大概有POJ 1981和POJ 2406,原理的话,可以看http://www.cnblogs.com/vongang/archive/2012/05/04/2483419.html这个博客

第二种的话,有POJ  2185

我所做过的一些Kmp题:

POJ 1961 http://blog.csdn.net/u010489766/article/details/9273097

POJ 2406http://blog.csdn.net/u010489766/article/details/9273171

POJ 2752http://blog.csdn.net/u010489766/article/details/9273245

POJ 3461 http://blog.csdn.net/u010489766/article/details/9273343

POJ 3080http://blog.csdn.net/u010489766/article/details/9273409

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值