408 数据结构|KMP算法核心:为什么不用主串回退

对应章节:串 → 模式匹配 → KMP算法

1. KMP到底解决什么问题

朴素匹配失败后:

复制代码
主串指针回退
模式串重新从头比较

KMP的核心:

主串指针不回退,只让模式串根据已经匹配的信息跳到合适位置。

2. 为什么能跳

假设模式串前面已经匹配成功一部分:

复制代码
主串:   ... A B C A B X ...
模式串:     A B C A B D

前面的:

复制代码
A B C A B

已经匹配成功。

当:

复制代码
X != D

朴素算法会让模式串从头重新试。

KMP不会。

它会看已经匹配成功的部分里,有没有:

复制代码
前缀 = 后缀

如果有,就直接把模式串跳过去继续比较。

3. 什么叫最长相等前后缀

以字符串:

复制代码
ABABA

为例。

前缀:

复制代码
A
AB
ABA
ABAB

后缀:

复制代码
A
BA
ABA
BABA

最长相等前后缀:

复制代码
ABA

长度:

复制代码
3

所以发生失配时,可以保留这3个字符已经匹配的信息。

4. KMP真正利用的是什么

KMP利用的是:

复制代码
模式串自身的结构

也就是提前分析:

复制代码
哪些前缀和后缀相同

然后得到:

复制代码
next数组

5. next数组是干什么的

next数组告诉你:

模式串第 j 个字符失配时,下一个应该去比较模式串的哪个位置。

也就是:

复制代码
失配
↓
查next[j]
↓
模式串跳到新的位置

主串的位置不回退。

6. KMP匹配过程

核心流程:

复制代码
主串字符 == 模式串字符
→ 两个指针一起后移

主串字符 != 模式串字符
→ 主串不动
→ 模式串根据next跳转

7. 为什么KMP比朴素算法快

朴素算法最坏可能达到:

复制代码
O(nm)

KMP匹配时主串基本只向前走。

总复杂度通常写:

复制代码
O(n+m)

其中:

复制代码
n = 主串长度
m = 模式串长度

8. 408最应该记住的三句话

复制代码
1. KMP主串指针不回退
2. 失配后模式串按next数组跳
3. next数组来自模式串的最长相等前后缀

9. 一句话总结

KMP就是:前面白匹配的部分不要浪费,利用模式串自己的前后缀关系,失配后直接跳到最可能继续匹配的位置。

相关推荐
生态学者5 小时前
Global Change Biology | 森林越“步调一致”,反而越怕干旱?树木生长与叶片活动的同步之谜
大数据·人工智能·算法·r语言·微信公众平台
lsswear5 小时前
Agent 框架新手入门与实战部署指南
大数据·人工智能·算法
学逆向的5 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全
Data analyse4567 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
Navigator_Z8 小时前
LeetCode //C - 1293. Shortest Path in a Grid with Obstacles Elimination
c语言·算法·leetcode
Nil2089 小时前
leetcode 64最小路径和
算法·leetcode·职场和发展
光影少年9 小时前
AI Agent、自动化与未来工作
人工智能·算法·架构
牧羊人.3339 小时前
计算机视觉基础 第16章|EigenFace,FisherFace,LBPH传统人脸识别算法
人工智能·算法·计算机视觉
jeo陽9 小时前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构
Nil2089 小时前
leetcode 72编辑距离
算法·leetcode·职场和发展