KMP算法
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth、J.H.Morris和V.R.Pratt提出的(简称KMP算法)。
KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。
KMP模式匹配算法主要用于字符串的匹配,大大可以减少重复遍历的情况
算法原理
- 官方介绍:http://www-igm.univ-mlv.fr/~lecroq/string/node8.html
- 核心思想:计算出模式串的部分匹配表,避免字符串重复匹配,提高查找的效率
- 例如:
- 分析“aabaaf”的最大公共前后缀
KMP实现代码C++
void GetNext(string needle, vector<int> &next)
{
for (int i = 1, k = 0; i < needle.size(); ++i) {
while (k && needle[k] != needle[i])
k = next[k - 1];
if (needle[k] == needle[i])
++k;
next[i] = k;
}
}
int IndexKMP(string haystack, string needle) {
if (needle.empty())
return 0;
vector<int> next(needle.size(), 0);
GetNext(needle, next);
for (int i = 0, k = 0; i < haystack.size(); ++i) {
while (k && needle[k] != haystack[i])
k = next[k - 1];
if (needle[k] == haystack[i])
++k;
if (k == needle.size())
return i - k + 1;
}
return -1;
}