AcWing 831. KMP字符串

题目传送门

一、什么是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;
}

原文地址:https://www.cnblogs.com/littlehb/p/15262401.html