后缀数组(Suffix Array)是一个整数数组,存储字符串所有后缀按字典序排序后的起始下标。比如字符串 "ababa",它的5个后缀是:
"ababa"(0)、"baba"(1)、"aba"(2)、"ba"(3)、"a"(4)
按字典序排序后为:
"a"(4)、"ababa"(0)、"aba"(2)、"baba"(1)、"ba"(3)
所以后缀数组 SA = [4, 0, 2, 1, 3]
对长度为 n 的字符串,生*部 n 个后缀,用 std::sort 配合自定义比较函数排序即可。时间复杂度 O(n² log n),适用于 n ≤ 5000 的教学或小规模场景。
关键点:
- 后缀用 std::string_view 或 substr 避免拷贝
- 比较函数直接比后缀内容(不是下标)
核心思想是分轮排序:先按长度为 1 的前缀排,再按长度为 2 的前缀排,然后是 4、8……直到 ≥n。每轮用上一轮的排名作为“第一关键字”,右半段排名作为“第二关键字”,用基数排序或 std::sort 稳定排序。
简化版步骤(不写完整基数排序):
- 维护 rank[i] 表示以 i 开头的后缀在当前长度下的排名
- 每轮构造 pair
- 重新编号得到新 rank,gap *= 2
注意:
- 边界处理:i+gap 超出范围时,第二关键字设为 -1(最小)
- rank 数组可复用,用 vector
// 编译:g++ -std=c++17 sa.cpp
#include#include #include #include #include std::vector
build_suffix_array(const std::string& s) { int n = s.size(); std::vector sa(n), rank(n), tmp_rank(n); for (int i = 0; i < n; ++i) { sa[i] = i; rank[i] = s[i] ; }
for (int gap = 1; gap < n; gap *= 2) { auto cmp = [&](int i, int j) { if (rank[i] != rank[j]) return rank[i] < rank[j]; int ri = (i + gap < n) ? rank[i + gap] : -1; int rj = (j + gap < n) ? rank[j + gap] : -1; return ri < rj; }; std::sort(sa.begin(), sa.end(), cmp); tmp_rank[sa[0]] = 0; for (int i = 1; i < n; ++i) { tmp_rank[sa[i]] = tmp_rank[sa[i-1]] + (cmp(sa[i-1], sa[i]) ? 1 : 0); } rank.swap(tmp_rank); } return sa;}
int main() { std::string s = "ababa"; auto sa = build_suffix_array(s); std::cout
小结与提醒
后缀数组本身只是排序结果,真正用起来常配合 height 数组(相邻后缀的 LCP)做字符串匹配、重复子串、最长回文子串等。这个版本没实现 height,但 SA 是基础。
实际项目中可考虑用现成库如 libdivsufsort,但手写倍增有助于吃透字符串算法逻辑。
基本上就这些 —— 不复杂但容易忽略边界和 rank 更新细节。
# c++
# go
# ai
# ios
# stream
# 键值对
# String
# Array
# sort
# for
# auto
# 字符串
# int
# iota
# 算法
# 长度为
# 是一个
# 设为
# 适用于
# 自定义
# 可通过
# 到新
# 再按
# 键值
# 不写
相关文章:
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
建站主机核心功能解析:服务器选择与网站搭建流程指南
用v-html解决Vue.js渲染中html标签不被解析的问题
如何确保西部建站助手FTP传输的安全性?
建站主机选择指南:服务器配置与SEO优化实战技巧
,想在网上投简历,哪几个网站比较好?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
个人网站制作流程图片大全,个人网站如何注销?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何获取免费开源的自助建站系统源码?
如何高效利用亚马逊云主机搭建企业网站?
如何在Windows服务器上快速搭建网站?
定制建站是什么?如何实现个性化需求?
*服务器网站为何频现安全漏洞?
建站三合一如何选?哪家性价比更高?
如何选择高效响应式自助建站源码系统?
如何选择域名并搭建高效网站?
如何在IIS中新建站点并配置端口与物理路径?
网站制作服务平台,有什么网站可以发布本地服务信息?
如何设置并定期更换建站之星安全管理员密码?
建站主机默认首页配置指南:核心功能与访问路径优化
微信小程序 五星评分(包括半颗星评分)实例代码
制作旅游网站html,怎样注册旅游网站?
如何通过商城免费建站系统源码自定义网站主题?
宿州网站制作公司兴策,安徽省低保查询网站?
jQuery 常见小例汇总
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
中山网站推广排名,中山信息港登录入口?
如何撰写建站申请书?关键要点有哪些?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
安徽网站建设与外贸建站服务专业定制方案
Swift中循环语句中的转移语句 break 和 continue
如何快速搭建虚拟主机网站?新手必看指南
阿里云网站制作公司,阿里云快速搭建网站好用吗?
招贴海报怎么做,什么是海报招贴?
如何快速搭建高效简练网站?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
制作表格网站有哪些,线上表格怎么弄?
高端网站建设与定制开发一站式解决方案 中企动力
建站之星展会模板:智能建站与自助搭建高效解决方案
官网网站制作腾讯审核要多久,联想路由器newifi官网
如何用PHP快速搭建CMS系统?
网站制作员失业,怎样查看自己网站的注册者?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
如何通过建站之星自助学习解决操作问题?
香港服务器WordPress建站指南:SEO优化与高效部署策略
如何在建站宝盒中设置产品搜索功能?
*请认真填写需求信息,我们会在24小时内与您取得联系。