1 条题解
-
0
问题分析
给定一个长度为 的字符串 ,要求找出字典序第 小的子串。参数 控制计数方式:
:不同位置的相同子串算作一个
:不同位置的相同子串算作多个
算法思路
总体架构
代码使用后缀数组(Suffix Array)作为核心数据结构,然后根据 的值分别处理两种情况。
关键数据结构:后缀数组
后缀数组 表示将所有后缀按字典序排序后,第 小的后缀在原字符串中的起始位置。
相关数组:
:排名第 的后缀起始位置
:起始位置为 的后缀的排名
: 与 的最长公共前缀长度
情况1:(相同子串算一个)
算法思路:
1.按字典序遍历所有后缀
2.对于每个后缀 ,它贡献的新子串数量为:
:该后缀的所有前缀(即所有以该位置开始的子串)
减去 :去掉与上一个后缀重复的前缀
3.当累计的新子串数量达到 时,输出对应的子串
情况2:(相同子串算多个)
算法思路:
1.预处理前缀和数组 ,表示前 个后缀包含的所有子串总数
2.使用二分查找确定第 小的子串:
维护当前搜索范围 ,表示可能包含目标子串的后缀排名区间
逐位确定子串的每个字符:
对于每个可能的字符 ,在 中二分查找以 开头的后缀范围
计算该字符对应的子串总数
根据 的值缩小搜索范围
复杂度分析
后缀数组构建:
情况:
情况:
总体复杂度:,可以处理 的数据规模。
总结
本题通过后缀数组高效处理了字符串子串的字典序排序问题,针对两种不同的计数需求设计了相应的算法:
:利用 数组去重,线性扫描
:结合前缀和与二分查找,逐位确定目标子串
- 1
信息
- ID
- 5129
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者