看KMP算法好几天了!今天有所感悟,就把感悟记录下来吧!这篇文章不讨论KMP算法的细节,因为对于这么一个经典的算法,有很多作者写得相当之深刻与清晰!
比如:July的博客(http://blog.csdn.net/v_JULY_v/article/details/6111565)
在这里向这位大牛致敬!也感谢提供这个博客给我的朋友(张钊)。
KMP算法的关键在于:next数组!我主要也卡在对next数组的理解上。看July的博客的时候,才觉得弄懂了next求的是什么,怎么求!
覆盖函数(overlay_function)
覆盖函数所表征的是pattern本身的性质,可以让为其表征的是pattern从左开始的所有连续子串的自我覆盖程度。
计算这个overlay函数的方法可以采用递推,可以想象如果对于pattern的前j个字符,如果覆盖函数值为k
a0a1...ak-1ak=aj-kaj-k+1...aj-1aj
则对于pattern的前j+1序列字符,则有如下可能
⑴ pattern[k+1]==pattern[j+1] 此时overlay(j+1)=k+1=overlay(j)+1
⑵ pattern[k+1]≠pattern[j+1] 此时只能在pattern前k+1个子符组所的子串中找到相应的overlay函数,h=overlay(k),如果此时pattern[h+1]==pattern[j+1],则overlay(j+1)=h+1否则重复(2)过程.
(摘自July的博客)
这样,KMP算法的核心就弄明白了!接下来的问题就只剩下字符串与pattern不匹配时跳转的步数问题了!