KMP算法

KMP算法是一种字符串匹配算法,可以在 O(n+m) 的时间复杂度内实现两个字符串的匹配

KMP算法通过记录相等前后缀的最大长度使得匹配串上的指针不回溯,并且快速跳过不匹配区域

其中最主要的是模式串中个个位置的公共(相等,公共这两个字搞得我迷糊了半天)前后缀的最大值,它将是跳跃匹配的”地图“,存储在next[]数组里,所以next[]数组的计算不需要匹配串的参与

求next[]

我们习惯将next数组以1开头,并且公共前缀的长度要求小于子串的长度(就是真子串)

next[i]表示模式串P[1,i]中相等前后缀的最长长度

模式串:aabaabaaaa中

image-20230904145453546

代码

ne[1] = 0;
for (int i = 2, j = 0; i <= n; i++) {
while (j && P[i] != p[j + 1]) j = ne[j];
if (P[i] == P[j + 1]) j++;
ne[i] = j;
}

模式串与主串匹配

代码

for (int i = 0, j = 0; i <= m; i++) {
while (j && S[i] != P[j + 1]) j = ne[j];
if (S[i] == P[j + 1]) j++;
if (j == n) cout << i - n + 1 << '\n';
}

使用双指针,i扫描主串,j扫描模式串
初始化i = 1, j = 0
每轮fori先右走一步

  1. S[i] != P[j + 1],让j回跳到能匹配的位置,如果找不到能匹配的位置,j回跳到0
  2. S[i]==P[j + 1],让j向右走一步
  3. 若匹配成功,输出匹配位置

模板:

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e4 + 10, M = 1e5 + 10;
int n, m;
char p[N], s[M];
int ne[N];
int main()
{
cin >> n >> p + 1 >> m >> s + 1;
// 求next过程
for (int i = 2, j = 0; i <= n; i++) {
while (j && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j++;
ne[i] = j;
}
// kmp匹配过程
for (int i = 1, j = 0; i <= m; i++) {
// j表示当前已经匹配成功的字符个数。在匹配过程中,如果j为0,说明当前没有匹配的字符,此时不需要进行回溯操作,直接继续向后匹配即可
while (j && s[i] != p[j + 1]) j = ne[j];
if (s[i] == p[j + 1]) j++;
if (j == n) {
// 匹配成功
}
}
return 0;
}

282【模板】KMP 算法_哔哩哔哩_bilibili

本文作者:-37-

本文链接:https://www.cnblogs.com/-37-/p/17661122.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   -37-  阅读(14)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.

作曲 : Reol

作词 : Reol

fade away...do over again...

fade away...do over again...

歌い始めの一文字目 いつも迷ってる

歌い始めの一文字目 いつも迷ってる

どうせとりとめのないことだけど

伝わらなきゃもっと意味がない

どうしたってこんなに複雑なのに

どうしたってこんなに複雑なのに

噛み砕いてやらなきゃ伝わらない

ほら結局歌詞なんかどうだっていい

僕の音楽なんかこの世になくたっていいんだよ

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

僕は気にしない 君は気付かない

何処にももういないいない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

忘れていく 忘れられていく

We don't know,We don't know.

目の前 広がる現実世界がまた歪んだ

目の前 広がる現実世界がまた歪んだ

何度リセットしても

僕は僕以外の誰かには生まれ変われない

「そんなの知ってるよ」

気になるあの子の噂話も

シニカル標的は次の速報

麻痺しちゃってるこっからエスケープ

麻痺しちゃってるこっからエスケープ

遠く遠くまで行けるよ

安定なんてない 不安定な世界

安定なんてない 不安定な世界

安定なんてない きっと明日には忘れるよ

fade away...do over again...

fade away...do over again...

そうだ世界はどこかがいつも嘘くさい

そうだ世界はどこかがいつも嘘くさい

綺麗事だけじゃ大事な人たちすら守れない

くだらない 僕らみんなどこか狂ってるみたい

本当のことなんか全部神様も知らない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

僕は気にしない 君は気付かない

何処にももういないいない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

忘れていく 忘れられていく

We don't know,We don't know.