1 { 2 next[0]=-1; 3 for(int i = 0,j=-1; i < (int)T.length(); ) 4 { 5 if(j==-1 || T[i]==T[j])//i一直比j大;若T[i]与T[j]不相等, else语句能把 6 //j减小到能与该第i个的字母相等或j返回到头时i++; 7 { 8 i++; 9 j++; 10 next[i] = j; 11 } 12 else j = next[j]; 13 } 14 }
KMP算法的难点就在于next指针。
接下来我就讲讲我对于next指针的个人理解:
一、为什么要next指针?
因为要在模式串的各个位置上记录这个位置之前的最长的相同前后缀的长度。
二、什么是前后缀?
为了跳过不必要的重复匹配。
三、如何计算最大的前后缀?
见以上代码;
但是呢,在用KMP算法的过程中我遇到了两个问题(我觉得有必要记录一下):
一、动态创建的数组传递形参要用指针而不能用数组首地址 。
二、在用str.length()进行代数计算时要加上(int)进行类型转换。
1 string S; 2 S.length();//这是无符号整型