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\) 的后缀每个字符都一样。

每次匹配时,我们发现在失配后寻找有可能匹配成功的串的过程是及其多余的,也是极其慢的。

如何求 NEXT?

posted @ 2024-08-07 21:57  PM_pro  阅读(26)  评论(0)    收藏  举报