c++字符串转字符数组_字符串问题一大利器——后缀数组详解

4464d2f5329ba46aac3134545504b548.png

今天,我们来介绍一下解决字符串问题的一大利器——后缀数组。

几个定义

为了下文表示的方便,我们需要先达成几个共识。

1、字符串的位置从0开始标号,一直到n-1.

2、后缀i,表示从i...n-1这些字符按顺序组成的字符串。显然,该字符串是原字符串的一个后缀。

3、字符串的大小比较:从第0个位置开始比较。如果相同,继续往后比;如果不同,则当前位置字符ASCII码大的对应字符串更大。如果仍无法比较大小,则长度长的字符串更大,否则两者相等。举个栗子:

b358397e96e70323e62c0def98dca12d.png

后缀数组是啥

后缀数组,顾名思义,就是把一个字符串的每一个后缀都进行排序。在这个算法中,我们需要处理得到两个数组,第一个数组记录的排名第i的后缀是哪一个(sa数组),第二个数组是第i个后缀的排名是多少。

举个栗子:

a3eca62c4b104a20a2f7134350feb97c.png

sa数组就是我们通常所说的后缀数组,而rank数组可以通过sa数组快速求得。我们这个算法就是为了快速地求出sa数组的值。

后缀数组怎么求

求解后缀数组有两种方法:倍增算法,DC3算法。

其中,倍增算法的时间复杂度是O(NlogN)的,程序简单,算法过程易于理解。而DC3算法的时间复杂度是O(N),数据量大的时候,效率比倍增算法有显著提升,但是缺点在于DC3算法原理较难理解,代码冗长。所以,这里我们讲解倍增算法

下面进入正题(为了防止格式错乱,采用图片的形式来讲解)。

e033de02e5c637e59fc99197deb60f5f.png

Code

#include 

写在最后

后缀数组的精华在于用sa数组求出height数组,而height数组有着各式各样的性质和用法,我将在下期为大家带来。


【信息学竞赛从入门到巅峰】,一个专注于分享OI/ACM常用算法及知识的公众号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值