初识KMP算法

103 阅读1分钟

题目

LeetCode题目:28.找出字符串中第一个匹配项的下标

代码

先贴代码~

KMP.png

难点

1. 构建next数组

情况一:匹配成功

容易理解,不再赘述看图即可~

image.png

情况二:匹配失败

串A和串B是相同的!B的后缀等于A的后缀!因此,使得A的k-前缀等于B的k-后缀的最大的k,其实就是串A的最长公共前后缀的长度 —— next[now-1]!

image.png

2. 移动标尺

模式串移动next[pos - 1]

在 S[0] 尝试匹配,失配于 S[3] <=> P[3] 之后,我们直接把模式串往右移了两位,让 S[3] 对准 P[1]. 接着继续匹配,失配于 S[8] <=> P[6], 接下来我们把 P 往右平移了三位,把 S[8] 对准 P[3]. 此后继续匹配直到成功。

image.png

鸣谢