一、什么是KMP算法
1、代码随想录的理论篇
https://www.bilibili.com/video/BV1PD4y1o7nd
2、代码随想录的代码篇
https://www.bilibili.com/video/BV1M5411j7Xx
二、C++ 代码
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int ne[N];
int n, m;
string p, s;
int main() {
cin >> n >> p >> m >> s;
//1、构建ne数组(前缀表:最长相等前后缀的长度)
//i是待匹配位置,j是已匹配长度,j - 1是已匹配的最后一个位置
//与自身匹配i从1开始
for (int i = 1, j = 0; i < p.size(); i++) {
while (j && p[i] != p[j]) j = ne[j - 1];
if (p[i] == p[j]) j++;
ne[i] = j;
}
// 测试用例:
// 6 aabaaf 10 aabaafaaba
// 结果:010120
//输出前缀表
//for (int i = 0; i < p.size(); i++)printf("%d", ne[i]);
//printf("
");
//2、求匹配位置
//与长字符串匹配i从0开始
for (int i = 0, j = 0; i < m; i++) {
while (j && s[i] != p[j]) j = ne[j - 1];
if (s[i] == p[j]) {
j++;
if (j == n) {
cout << i - n + 1 << " ";
j = ne[n - 1];
}
}
}
return 0;
}