子序列自动机:原理、构建与应用
1. 什么是子序列自动机子序列自动机Subsequence Automaton是一种用于高效处理字符串子序列匹配问题的数据结构。给定一个文本串S长度n子序列自动机可以在O(|T|)的时间复杂度内判断任意一个模式串T是否是S的子序列而无需每次重新扫描整个S。这里“子序列”的定义是从原字符串中删除零个或多个字符后保持剩余字符相对顺序不变所形成的新字符串。例如“ace” 是 “abcde” 的子序列。2. 核心原理与构建子序列自动机的核心思想是预处理文本串S构建一个状态转移表next[i][c]表示从位置i开始下一个字符c出现的最早位置。如果不存在则记为n或一个特殊值。构建过程通常采用从后向前扫描的动态规划方法// 假设字符集大小为 26小写字母 vectorvectorint buildSubsequenceAutomaton(const string s) { int n s.length(); vectorvectorint next(n 1, vectorint(26, n)); for (int i n - 1; i 0; --i) { next[i] next[i 1]; next[i][s[i] - a] i; } return next; }这样对于任意模式串T我们可以从pos 0开始依次查找next[pos][T[j]]如果某次查找到n则说明T不是S的子序列。3. 时间复杂度与空间复杂度预处理构建O(n * |Σ|)其中|Σ|是字符集大小。单次查询O(|T|)与文本串长度n无关。空间复杂度O(n * |Σ|)可以通过滚动数组优化到O(|Σ|)但查询时需要从后向前重新计算牺牲查询时间。4. 典型应用场景多模式子序列匹配需要频繁判断大量短串是否为某个长串的子序列时预处理一次每次查询O(|T|)。字符串包含性检查在编辑距离、DNA序列比对等场景中快速判断一个串是否“包含”另一个串作为子序列。动态规划优化某些 DP 问题中状态转移需要查找下一个特定字符的位置子序列自动机可以加速这一过程。竞赛编程题目如 Codeforces、LeetCode 中涉及子序列匹配的题目。5. 代码示例完整可运行#include iostream #include vector #include string using namespace std; class SubsequenceAutomaton { private: vectorvectorint next; int n; public: SubsequenceAutomaton(const string s) { n s.length(); next.assign(n 1, vectorint(26, n)); for (int i n - 1; i 0; --i) { next[i] next[i 1]; next[i][s[i] - a] i; } } bool isSubsequence(const string t) { int pos 0; for (char c : t) { if (pos n) return false; pos next[pos][c - a] 1; if (pos n) return false; } return true; } }; int main() { string s abcde; SubsequenceAutomaton sa(s); cout sa.isSubsequence(ace) endl; // 1 (true) cout sa.isSubsequence(aec) endl; // 0 (false) return 0; }6. 与其他数据结构的对比数据结构预处理时间单次查询时间适用场景子序列自动机O(n * |Σ|)O(|T|)多次子序列匹配双指针扫描无O(n |T|)单次查询后缀自动机O(n)O(|T|)子串匹配、更多复杂操作Trie 树O(总长度)O(|T|)前缀匹配、字典查询7. 总结子序列自动机是一种用空间换时间的典型数据结构适用于文本串固定、需要频繁进行子序列匹配的场景。虽然其空间开销相对较大但在字符集较小如小写字母、数字或文本串长度可接受时能带来显著的查询效率提升。在算法竞赛和某些特定字符串处理任务中它是一个值得掌握的工具。

相关新闻

解决VS无法打开assert.h等标准头文件的配置问题

解决VS无法打开assert.h等标准头文件的配置问题

1. 问题现象与根源剖析“VS无法打开源文件 ‘assert.h’ ‘string.h’”,这个报错对于刚接触Visual Studio进行C/C开发的朋友来说,简直就像一盆冷水,瞬间浇灭了写第一行代码的热情。你满心欢喜地新建了一个项目,准备大展拳脚&…

2026/10/5 4:16:12 阅读更多 →
大模型推理全流程解析:从Prompt到第一个Token的生成原理与优化实践

大模型推理全流程解析:从Prompt到第一个Token的生成原理与优化实践

1. 从“你好”到“你”:一次请求的漫长旅程当你在聊天框里输入一句“你好”,然后按下回车,屏幕上的光标开始闪烁,几秒钟后,模型开始逐字逐句地回复你。这个看似简单的交互背后,其实是一场跨越了模型内部数十…

2026/10/5 5:53:41 阅读更多 →
康奈尔笔记法融合AIGC:构建结构化智能笔记系统

康奈尔笔记法融合AIGC:构建结构化智能笔记系统

1. 项目概述:当经典笔记法遇上AIGC如果你还在为整理课堂笔记、会议纪要或者读书心得而头疼,每次面对满屏的文字不知如何下手,那么“康奈尔笔记AIGC”这个组合,可能会彻底改变你的信息处理方式。简单来说,它就是将风靡全…

2026/10/5 5:53:33 阅读更多 →

最新新闻

基于SpringBoot的北京民宿推荐系统:内容算法与首都特色实践

基于SpringBoot的北京民宿推荐系统:内容算法与首都特色实践

1. 内容整体设计与思路拆解1.1 为什么是民宿推荐系统,而不是酒店预订系统先说个现象。很多人在做毕业设计时,一提到旅游住宿类系统,第一反应就是"酒店管理系统""民宿预订平台",但这类题目在答辩时很容易被打低…

2026/10/13 22:01:45 阅读更多 →
大模型应用落地实战指南:从选型到系统集成的全链路解析

大模型应用落地实战指南:从选型到系统集成的全链路解析

1. 项目概述:一张动态演进的“大模型生态地图”到底该怎么画?“国内外知名大模型及应用——模型/应用维度(2026/10/08)”这个标题,表面看是一份静态快照,实则暗含三重张力:时间戳“2026/10/08”…

2026/10/13 22:01:45 阅读更多 →
MFC界面美化完整案例:自绘控件、去标题栏与自适应布局

MFC界面美化完整案例:自绘控件、去标题栏与自适应布局

简介:这是一套面向Windows桌面开发者的MFC界面美化完整工程案例,可直接用VS2022打开运行,解决原生菜单栏、标题栏、按钮及列表控件外观老旧、贴图与自适应设计困难的问题。工程去除了MFC自带菜单和系统标题栏相关元素,对顶部区域自…

2026/10/13 22:01:45 阅读更多 →
cangaroo USB-CAN上位机源码:编译、调试与二次开发指南

cangaroo USB-CAN上位机源码:编译、调试与二次开发指南

简介:这是一份Cangaroo USB-CAN上位机完整源码,采用Qt图形界面框架开发,面向需要进行CAN总线数据监控、报文分析与设备调试的软硬件工程师。压缩包共包含两百一十四份文件,其中C和C语言的头文件与实现文件占主要比例,还…

2026/10/13 22:01:45 阅读更多 →
烂番茄影评情感分类实战:Python实现从TF-IDF到BiLSTM

烂番茄影评情感分类实战:Python实现从TF-IDF到BiLSTM

简介:基于Python实现对烂番茄电影评论情感分类的完整实践项目,来源于华中科技大学大数据与人工智能课程大作业。项目包含源码、实验报告与数据集,覆盖评论获取、文本预处理、情感特征提取、模型训练与评估等环节,适合计算机、人工…

2026/10/13 22:01:45 阅读更多 →
开源AI工具实战:让大模型从聊天到本地自动化干活

开源AI工具实战:让大模型从聊天到本地自动化干活

1. 从聊天到干活:这个开源AI工具到底在解决什么问题大多数人第一次接触AI,都是通过对话框。你问一句,它答一句,聊得挺热闹,但聊完之后呢?该手动复制的还得手动复制,该自己打开软件操作的还得自己…

2026/10/13 22:00:44 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →