KMP算法是一种线性时间字符串匹配算法,这个算法不用计算变迁函数,匹配时间为O(n),只用到了辅助函数π,这是在O(m)的时间内根据模式预先计算出来的。
模式的前缀函数π包含有模式与自身的位移进行匹配的信息。简单的来说,如果字符串中某前缀的后缀包含了某前缀,则在比较的时候能够免去对无用位移进行测试。
构件π函数的伪代码如下所述
m=length(P);
k=0;
π(1)=0;
for q=2 to m
{
while(k>0&&P(k+1)==P(q))
k=π(k);
if(P(k+1)==P(q))
k=k+1;
π(q)=k;
}
简单的用java代码实现如下所示
对于题目:在n个txt文档中找含有字符串“love”的文档。这个相对于上述KMP算法就简单的多了。该字符串中无重复字符,更不用提重复的前后缀了。在匹配的时候,指针扫描,如果出现不匹配现象,直接当前文档位置的字符从l开始匹配即可。查找时间为线性时间。