KMP算法是一种常用的字符串匹配算法,下面介绍算法流程。
举个栗子:
待查找的字符串:ACAABC
匹配串:ACAB
当匹配到第四个字符的时候,A!=B,这时,可以将匹配串右移一位继续匹配,但是考虑到ACA的前缀与后缀有一个公共位A,即第一个A与第三个A是对应位。所以可以直接右移两位直接比较C、A。
代码:
bool kmp(const string& query, const string& pattern) {
int n = query.size();
int m = pattern.size();
// 这里先为匹配串各个字符构造一个对应关系
vector<int> fail(m, -1);
for (int i = 1; i < m; ++i) {
int j = fail[i - 1];
while (j != -1 && pattern[j + 1] != pattern[i]) {
j = fail[j];
}//递归找到对应位
if (pattern[j + 1] == pattern[i]) {
fail[i] = j + 1;
}
}
//依据上面的对应关系,调整比较位
int match = -1;
//这里的范围与题目相关,一般的是(0,n)
for (int i = 1; i < n - 1; ++i) {
while (match != -1 && pattern[match + 1] != query[i]) {
match = fail[match];
}//递归找到匹配位
if (pattern[match + 1] == query[i]) {
++match;
if (match == m - 1) {
return true;
}
}
}
return false;
}