您的位置:首页 > 其它

关于KMP的一些个人理解

2013-07-08 16:15 537 查看
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是t[]数组的长度,不存在t
但是存在next
因为next[n-1]是不包括t[n-1]在内,而为了解决这个问题,所以只能增加一个next
,这样的话next
就能包括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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  理解