KMP算法C++实现 - 自用
代码实现
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int getKMP(const string& t, const string& p) {
int index = -1;
int pLength = p.length();
int tLength = t.length();
vector<int> next(pLength, -1);
int k = -1;
for (int i = 1; i < pLength; i++) {
while (k > -1 && p[i] != p[k + 1]) {
k = next[k];
}
if (p[i] == p[k + 1]) {
k = k + 1;
}
next[i] = k;
}
k = -1;
for (int i = 0; i < tLength; i++) {
while (k > -1 && t[i] != p[k + 1]) {
k = next[k];
}
if (t[i] == p[k + 1]) {
k = k + 1;
if (k == pLength - 1) {
index = i - pLength + 1;
break;
}
}
}
return index;
}
int main() {
string t = "ACAABCABCABABA";
string p = "ABCABA";
int index = getKMP(t, p);
cout << index << endl;
return 0;
}
KMP算法巧妙非凡,理解算法的最好方式就是在本地下断点逐过程走一遍。KMP算法分为两个部分,首先是根据模式串生成next数组,储存当前模式串最长前缀长度,为后一部分开始遍历时服务;
先简单记录下,后续待补充