CSPS~省选 PM_pro's 字符串算法合集
我是 PM_pro
简介
字符串作为一个较大的专题,涉及诸多知识点,其中某些算法晦涩难懂,成为了初学者的噩梦。此文章用于总结、巩固和分享字符串知识,本文会尽可能的用简洁的语言将字符串知识讲的简单一点,本文除特殊解释,字符串下标一律从 \(1\) 开始。
定义
-
子串:部分串,如 \(clbzdqzdqzdqjiunihaixiangxueoi\) 的子串是 \(clbzdq\) 和 \(jiunihaixiangxueoi\)。
-
前缀:即字面意思,指字符串中从 \(1\) 到 \(x\) 的子串。
-
后缀:同字面意思,指字符串中从 \(x\) 到字符串结尾的子串。
chapter 1
介绍
较简单。
KMP
引入
考虑有两个字符串 \(S1\) 与 \(S2\)。考虑求出所有 \(S1\) 在 \(S2\) 中出现的起始位置。怎么求呢?/wn
一种暴力的做法是直接按位比较,如果不成功则直接将左端点往后移一位,然后继续从左端点开始比较。
太慢了!,这样的时间复杂度是 \(O(nm)\) 的,在数据为 \(10^4\) 时就超时了。
为了较高效的求解此问题,我们就需要用到 KMP 算法。
分部分讲解。
NEXT 数组及其应用
别称 border。
即为字符串中最大的 \(x\),使得该字符串长度为 \(x\) 的前缀与长度为 \(x\) 的后缀每个字符都一样。
每次匹配时,我们发现在失配后寻找有可能匹配成功的串的过程是及其多余的,也是极其慢的。

浙公网安备 33010602011771号