KMP算法的介绍与POJ上一些相关的题目
一 :KMP算法的介绍
KMP算法的核心是构造next[]数组。先搞清楚next数组的含义。例如:next[j] = k;这样的一个式子表示的含义是:当主串中第i个元素与模式串中的第j个元素匹配失败时,应该保持i指针不动,而将模式串中的j指针移动到k这个位置。然后将主串中第i个元素与模式串中的第j个元素匹配。若匹配的话就同时移动i和j指针。不匹配的话,再次计算next[k] = ?.....依次进行。
所以KMP算法的本质就是主串中i指针不回溯。
下面来一步步的证明next[]数组的构造过程。
第一步:
设主串S = “s1s2…sn”, T= “t1t2…tm”.
若满足:
(1) “si-j+1…si-1” = “t1..tj-1”;
(2) “t1t2…tk-1”= “tj-k+1tj-k+1…tj-1”;(1<k<j)
在同时满足(1),(2)的条件下,可以直接比较si 和 tk;
若对于任意的1<k<j,条件(2)都不满足,则直接比较si和t1;
第二步:
模式串t的next函数:
当s