括号序列
定义一个合法括号序列(balanced bracket sequence)为仅由
- 空串
\varepsilon - 如果
s (s) - 如果
s,t st
例如
有时候会有多种不同的括号,如
本文将会介绍与括号序列相关的经典问题。
注:英语中一般称左括号为 opening bracket,而右括号是 closing bracket。
判断是否合法¶
判断
我们维护一个栈,对于
- 如果
s_i s_i - 若不满足上述条件,则将
s_i
在遍历整个
合法括号序列计数¶
考虑求出长度为
这同样是卡特兰数的递推式。也就是说
当然,对于变种合法括号序列的计数,方法是类似的。假设有
字典序后继¶
给出合法的括号序列
我们需要找到一个最大的
不妨设当
该算法的时间复杂度是
参考实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | bool next_balanced_sequence(string& s) {
int n = s.size();
int depth = 0;
for (int i = n - 1; i >= 0; i--) {
if (s[i] == '(')
depth--;
else
depth++;
if (s[i] == '(' && depth > 0) {
depth--;
int open = (n - i - 1 - depth) / 2;
int close = n - i - 1 - open;
string next =
s.substr(0, i) + ')' + string(open, '(') + string(close, ')');
s.swap(next);
return true;
}
}
return false;
}
|
字典序计算¶
给出合法的括号序列
考虑求出字典序比
不妨设
不妨设
通过枚举括号序列第一个字符是什么,可以得到
这样我们就可以
对于变种括号序列,方法是类似的,只不过我们需要对每个
另外,利用
本页面主要译自博文 http://e-maxx.ru/algo/bracket_sequences 与其英文翻译版 Balanced bracket sequences。其中俄文版版权协议为 Public Domain + Leave a Link;英文版版权协议为 CC-BY-SA 4.0。
build本页面最近更新:,更新历史
edit发现错误?想一起完善? 在 GitHub 上编辑此页!
people本页面贡献者:sshwy
copyright本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用