字符串学习:字符串算法选讲-金策

本文深入探讨了字符串的周期和Border概念,介绍了KMP算法如何在O(n)时间内求解最大Border长度,并讨论了后缀数组和LCP查询的应用。通过Periodicity Lemma和Weak Periodicity Lemma,揭示了周期与最小公倍数的关系。最后,分析了Border结构的等差数列特性,以及在不同长度范围内的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

周期和border

0&lt;q≤∣s∣,s[i]=s[i+p],∀i∈1...∣s∣−p0 &lt; q \le |s|, s[i] = s[i+p], \forall i \in {1...|s|- p}0<qs,s[i]=s[i+p],i1...sp, ppp就是sss的周期。
0≤r≤∣s∣,pre(s,r)=suf(s,r),pre(s,r)0 \le r \le |s|, pre(s, r) = suf(s, r), pre(s, r)0rs,pre(s,r)=suf(s,r),pre(s,r)就是sssborderborderborder

KMP算法

可以在O(n)O(n)O(n)时间求出数组fail[1,n]fail[1, n]fail[1,n],其中fail[i]fail[i]fail[i] 代表前缀s[1...i]s[1...i]s[1...i]的最大borderborderborder长度。
sss的所有borderborderborder长度?
fail[n],fail[fail[n]]....{fail[n], fail[fail[n]] .... }fail[n],fail[fail[n]]....

后缀数组和LCP查询

在预处理之后,可以O(1)O(1)O(1)的求解LCP,LCS。LCP, LCS。LCP,LCS
对于拥有周期为ppp的串sssLCP(s[1...n],s[1+p...n])=n−pLCP(s[1...n], s[1+p...n]) = n - pLCP(s[1...n],s[1+p...n])=np
借助上述定理,就可以通过求解LCP(i,i+p)LCP(i, i + p)LCP(i,i+p)查询最大的lll使得s[i...i+l−1]s[i...i+l-1]s[i...i+l1]拥有周期ppp了。

Weak Periodicity Lemma

pppqqq是字符串sss的周期,p+q≤∣s∣,p+q \le |s|,p+qs,gcd(p,q)gcd(p,q)gcd(p,q)也是sss的周期。

Periodicity Lemma

pppqqq是字符串sss的周期,p+q−gcd(p,q)≤∣s∣,p+q - gcd(p, q) \le |s|,p+qgcd(p,q)s,gcd(p,q)gcd(p,q)gcd(p,q)也是sss的周期。
abaabaabaabaabaaba

字符串匹配

引理:字符串u,vu, vu,v满足2∣u∣≥∣v∣,2|u| \geq |v|,2uvuuuvvv中的所有匹配位置组成一个等差数列。若这个数列至少含有333项,则其公差ddd等于uuu的最小周期per(u),可以结合PeriodicityLemma用反证法证明设(p≤d)per(u),可以 结合Periodicity Lemma用反证法证明设(p \le d)per(u)PeriodicityLemma(pd)
此时per(u)≤∣u∣/2per(u) \le |u|/2per(u)u/2

Border的结构

引理1:字符串sss的所有不小于∣s∣/2|s|/2s/2borderborderborder的长度组成一个等差数列。
证明:设sss最大的borderborderborder的长度为n−p(p≤∣s∣/2)n - p (p \le |s|/2)np(ps/2), 另外某个borderborderborder的长度为n−q(q≤∣s∣/2),n-q(q \le |s|/2),nq(qs/2)pppqqq都是sss的周期,ppp为最小周期,那么gcd(p,q)gcd(p, q)gcd(p,q)也是sss的周期,可知ppp可能为000,因此gcd(p,q)≥p=&gt;p∣qgcd(p, q) \geq p =&gt; p | qgcd(p,q)p=>pq

s[1...n]s[1...n]s[1...n]的所有borderborderborder按长度xxx分类:
x∈[1,2),[2,4)...[2k−1,2k),[2k,n)x\in[1, 2), [2, 4) ... [2^{k-1}, 2^{k}), [2^k, n)x[1,2),[2,4)...[2k1,2k),[2k,n)
分开考虑每段区间

  • x∈[2k,n),2k≥n/2x\in[2^k, n), 2^k \geq n/2x[2k,n),2kn/2,里面的borderborderborder长度已证为等差数列。
  • x∈[2i−1,2i)x\in[2^{i-1}, 2^i)x[2i1,2i), 考虑串uuuvvv:
    ∣u∣=∣v∣|u| = |v|u=v
    PS(u,v)=k:pre(u,k)=suf(v,k)PS(u, v) = {k : pre(u, k) = suf(v, k)}PS(u,v)=k:pre(u,k)=suf(v,k)
    LargePS(u,v)=k∈PS(u,v),k≥∣u∣/2LargePS(u,v) = {k\in PS(u,v), k \geq |u| / 2}LargePS(u,v)=kPS(u,v),ku/2
    [2i−1,2i)[2^{i-1}, 2^i)[2i1,2i)内的borderborderborder长度集合为LargePS(pre(s,2i),suf(s,2i))LargePS(pre(s, 2^i), suf(s, 2^i))LargePS(pre(s,2i),suf(s,2i))
    引理:
    LargePS(u,v)LargePS(u, v)LargePS(u,v)组成一个等差数列。

推论:字符串border排序后可以分成O(log|s|)段,每段是一个等差数列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值