kmp
算法
求解给定一个模式串
和一个主串 ,求模式串 在主串 中出现的位置(字符串的下标均从1开始)
算法思路
- 取最长的相等前后缀,可以保证不漏解
- 通过模式串前后缀的自我匹配的长度,计算
函数,给 指针打一张表,失配时就跳到 的位置继续匹配
函数: 表示模式串 中相等前后缀的最长长度
如何计算 函数
双指针:
扫描模式串, 扫描前缀 初始化:
- 若
,让 回跳能匹配的位置,如果找不到能匹配的位置, 回跳到 - 若
,让 ,指向匹配前缀的末尾 等于 的值
计算 函数模板
1 | |
时间复杂度分析
指针所走的总步数就决定了总的执行次数 每轮
循环, 至多 ,那么 一共向右至多走 步,往左跳的步数加起来不会超过 步,否则 变为负数 故
的总步数不会超过 ,所以时间复杂度为
模式串与主串匹配算法模板
1 | |
kmp
http://example.com/2023/11/09/kmp/