您的位置:首页 > 其它

字符串匹配算法之KMP

2015-08-12 10:48 411 查看
给定两个字符串S、P,如何判断S中包含P?(假设S为较长字符串,要求P中字符在S中要连续出现)

这就是经典的字符串匹配问题。暴力匹配略去不说,一种较好的解法就是KMP。对于一个新手来说,想学习KMP,建议看如下两篇文章:

字符串匹配的KMP算法(阮一峰)

从头到尾彻底理解KMP(2014年8月22日版)

如果对第二篇中next数组的讲解不是很懂的话,建议看这篇

【经典算法】——KMP,深入讲解next数组的求解

本文主要给出kmp的实现:

int getnext(char *p, int next[])
{
int len = strlen(p);
next[0] = -1;
int k = -1, j = 0;
while (j < len)
{
while (k >= 0 && p[j] != p[k])
{
k = next[k];
}
k++;
j++;
next[j] = k;
}
return 0;
}

void kmp(char *s, char *p)
{
int slen = strlen(s);
int plen = strlen(p);
int *next = new int[plen + 1];    // size is plen + 1
getnext(p, next);
int i = 0, j = 0;
while (i < slen)
{
while (j >= 0 && s[i] != p[j])
{
j = next[j];
}
i++;
j++;
if (j == plen)
{
printf("found substring at index: %d\n", i - j);
j = next[j];    // to find more matches
}
}
delete [] next;    // do not forget
}


分析:

如果文本串的长度为n,模式串的长度为m,那么匹配过程的时间复杂度为O(n),算上计算next的O(m)时间,KMP的整体时间复杂度为O(m + n)。

Reference:

algorithm to find substring in a string (KMP Algorithm)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: