括号序列
定义一个合法括号序列(balanced bracket sequence)为仅由
- 空串
是一个合法括号序列。 - 如果
是合法括号序列,那么 也是合法括号序列。 - 如果
都是合法括号序列,那么 也是合法括号序列。
例如
有时候会有多种不同的括号,如
本文将会介绍与括号序列相关的经典问题。
注:英语中一般称左括号为 opening bracket,而右括号是 closing bracket。
判断是否合法
判断
我们维护一个栈,对于
- 如果
是右括号且栈非空且栈顶元素是 对应的左括号,就弹出栈顶元素。 - 若不满足上述条件,则将
压入栈中。
在遍历整个
合法括号序列计数
考虑求出长度为
这同样是卡特兰数的递推式。也就是说
当然,对于变种合法括号序列的计数,方法是类似的。假设有
字典序后继
给出合法的括号序列
我们需要找到一个最大的
不妨设当
该算法的时间复杂度是
字典序计算
给出合法的括号序列
考虑求出字典序比
不妨设
不妨设
通过枚举括号序列第一个字符是什么,可以得到
这样我们就可以
对于变种括号序列,方法是类似的,只不过我们需要对每个
另外,利用
本页面主要译自博文 http://e-maxx.ru/algo/bracket_sequences 与其英文翻译版 Balanced bracket sequences。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。
本页面最近更新:2/3/2023, 12:00:00 AM,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用