参考文献:如何更好地理解和掌握 KMP 算法?
vector<int> get_next_kmp(const string& pattern) {
int i = -1, j = 0;
vector<int> next(pattern.size() + 1, -1);//一定要初始化为-1!!!
while (j < pattern.size()) {
if (i == -1 || pattern[i] == pattern[j])
next[++j] = ++i;//记录下一个位置的PMT
else i = next[i];
}
return next;
}
int kmp(const string& target, const string& pattern) {
int t = 0, p = 0;
vector<int> next = get_next_kmp(pattern);
while (t < target.size() && p < (int)pattern.size()) {
if (p == -1 || target[t] == pattern[p]) {
t++, p++;
} else p = next[p];
}
if (p == pattern.size()) return t - p;
else return -1;
}
int main () {
string target = "121234123456789";
string pattern = "12345";
cout << kmp(target, pattern) << endl;
}