定义
KMP算法是解决字符串的匹配问题。
求解kmp算法的两个核心的问题就是求next数组和模式串匹配
我们主要讲模式串匹配问题,求next数组和匹配问题一样,我们就是将模式串往后移一位,然后在与本身匹配,就求得next数组
匹配过程
求ne数组
记住:KMP算法中字符串的下标都是从1开始的,从0开始会比较麻烦。且i和j是要错开一个位置的。
例题:
#include <iostream>
using namespace std;
const int N = 100010, M = 1000010;
int n, m;
int ne[N];
char s[M], p[N];
int main()
{
cin >> n >> p + 1 >> m >> s + 1;//字符串起始位置从1开始
//计算ne数组
for(int i = 2, j = 0; i <= n; ++i)
{
while(j && p[i] != p[j + 1]) j = ne[j];//没有匹配成功,j变成ne[j]的位置
if(p[i] == p[j + 1]) ++j;//匹配成功,j++
ne[i] = j;//记录匹配成功的i位和j位的对应关系
}
//匹配过程
for(int i = 1, j = 0; i <= m; ++i)
{
while(j && s[i] != p [j + 1]) j = ne[j];//没匹配成功,j变成ne[j]的位置
if(s[i] == p[j + 1]) ++j;//匹配成功,j往后一位
if(j == n)//完全匹配完毕
{
printf("%d ", i - n);
j = ne[j];//寻找p在s中的下一次出现的位置,利用ne数组优化时间复杂度
}
}
return 0;
}