本文将讲述关于字符串的基本概念以及延伸的推论。

注:如无特殊说明,通常情况下表示整数区间(即)而不是实数区间。类似地,

基本定义与符号表示

字符串:字符串通常使用单个字母表示,如

长度:字符串长度(Length)表示为

字符:字符串从左到右第个字符记为。如果没有特殊说明,通常是 1 作为起始下标。

子串:中第个字符到第个字符构成的串称作子串(Substring),记作。其中

前缀:如果,那么这个子串也被称作前缀(Prefix)

后缀:如果,那么这个子串也被称为后缀(Suffix)

周期与 Border

Border:若对于满足,那么称Border(也称的 Border)。

周期:若对于,使得,那么称周期(Period),也称的周期。

最小周期

每个周期(除了的周期)都对应了一个 Border。具体地,周期对应了 Border

求所有 Border:KMP 算法不停跳 Fail 指针即可。

周期引理

弱周期引理(Weak Periodicity Lemma):若都是的周期且,则也是的周期。

证明:不妨设。设,发现一定满足其中一个。因此可以退出。即的周期。那么辗转相减即可证明。

周期引理(Periodicity Lemma):若都是的周期且,则也是的周期。

字符串匹配

引理 1(等差数列引理):字符串满足,则中的所有匹配位置构成一个等差数列。

证明:

考虑其中的 3 次匹配:第 1 次,第 2 次和最后一次。设它们的间距分别是

根据周期的定义得,都是的周期。

由于,因此。因此根据周期引理也是的周期。

因此不难证明,(设第一次匹配的位置是都是匹配位置。即构成一个公差为的等差数列。更严格地说,是构成一个公差为的等差数列。

引理 2(公差引理):字符串满足,则中的所有匹配位置构成一个等差数列。若等差数列至少有 3 项,则其公差等于最小周期。此时易知

仅含两项时不一定成立,如

Border 的结构

引理(等差数列引理):字符串的所有长度不小于的 Border 的长度构成等差数列。

证明:

我们知道每个周期都对应一个 Border。而长度不小于的 Border 对应的周期满足周期引理。因此周期是等差数列,则得证。

上述引理刻画了长度不小于的 Border 的结构。那么对于长度更小的 Border 呢?

我们将的所有 Border 按长度分类,有两种情况:

  1. ,其中
  2. ,其中

对于第二种情况,我们使用上述引理即可。那么考虑第一种情况:

容易证明,如果存在 Border 的长度在,那么对于使用上述引理即可证明,中的 Border 也构成等差数列。

推论:字符串的所有 Border 按长度排序后可以分成段,使得每一段都是等差数列。

子串 Border 查询

给出长度为的字符串次询问形如,求的子串的所有 Border(等价于周期),用个等差数列的形式表示。

对于询问,设。仍然按照 Border 长度分成两类:

  1. ,其中
  2. ,其中

Case 1

,其中

如图的是一个满足要求的 Border。那么容易发现的前缀,而的后缀。

因此,不妨求出中匹配的位置的集合,以及中匹配的位置的集合。把做一下翻转和移位之后与取交集就是我们要求的了(事实上也是等差数列的交)。

因此我们的问题转化为:

询问子串中匹配的位置集合(等差数列形式)。

显然我们只需要求出它匹配的第一次,第二次和最后一次即可。换言之问题转化为

询问子串在位置后匹配的第一个位置 / 在前匹配的最后一个位置。

表示子串,即长度为 2 的幂的子串。这类子串的个数是的。因此我们求出它们的字典序排名,把排名相同的放一起按照出现位置排序。然后询问的时候在这个序列上二分即可。排序的过程和后缀数组构建的过程类似。

而且由于长度不同的子串排名一定不同,因此我们可以构建个序列(相当于是把后缀数组的构建过程记录下来)来处理询问。

那么求出了,如何求的交集?也就是求两个等差数列的交集。

如果公差相等那么容易求交集。

引理:四个字符串满足,且中匹配至少 3 次,中匹配至少 3 次,则,即最小周期相等。

反证:不妨设

的最后一次匹配与的交是。则

字符串匹配的公差引理

因此也是的周期。但,矛盾。

因此我们证明了如果是两个等差数列且长度超过 3,那么公差一定相等。因此求交集的复杂度是的。

综上,我们可以在的时间内处理的情况。

Case 2

,其中

即求长度不小于的 Border 集合。与 Case 1 做法相同。

综上,该算法空间复杂度,时间复杂度

习题:2015-2016 Petrozavodsk Winter Training Camp, Moscow SU Trinity Contest : D Deep Purple 代码

参考文献

字符串算法选讲,金策,清华大学交叉信息研究院,February 3, 2017