16年12月26日再次编辑
昨晚在看清华严蔚敏的数据结构,重温了一遍KMP算法。严奶奶讲的特别详细特别透彻。发现自己还是有一些东西想岔了,这里重新修补下原来的博文。
问题主要集中在next[]数组的优化方面,在原来的地方用红色重写一下。
*********************************我是原来博文的分隔符********************************
这两天在看哈工大王宏志老师的算法设计入门课,讲到了KMP算法,这个之前也学习过,但一直没有搞的特别明白。于是花了两天的时间,看博客什么的,比如http://www.aboutyun.com/thread-9994-1-1.html就讲的很好。总之现在终于稍微清楚一点了,有一些相关的误区和优化想记录下来.。代码均在xcode(GCC)上可通过,都是很浅的东西,不知道有没有比我还小白的人看。
1. HOW TO GET next[]
(1) 明确next数组是针对子串PATTERN的,与原字符串S无关!//有一个相互匹配的问题,两个字符串,一般长的是S。或者,不重复的是S。(为什么?因为复杂度与p的长度有关,也与重复性有关。)
(2)next数组记录的是前缀-后缀的最大长度,而不是个数. 前缀中每一个都含有首字符,后缀中每一个都含有末字符。比较时是类似队列那种依次向后的比较方法。可以分为4种情况:
(3) 最笨的方法,非递归,没有出现k=next[k] or k=next[k-1] 这种情况
void GetNext(char* p,int next[])
{
next[0] = 0;
int k = 0;
int j = 1;
while (j < strlen(p) )
{
//k是前缀下标,j是后缀下标
if(k!=0 && p[k]!=p[j]) //分四种情况,根据k是否等于0(或>0,一样的,因为K不会<0)和P[K]是否等于p[j]