Bracket
定义一个合法括号序列(balanced bracket sequence)为仅由
- 空串
\varepsilon - 如果
s (s) - 如果
s,t st
例如
有时候会有多种不同的括号,如
本文将会介绍与括号序列相关的经典问题。
注:英语中一般称左括号为 opening bracket,而右括号是 closing bracket。
判断是否合法¶
判断
我们维护一个栈,对于
- 如果
s_i s_i - 若不满足上述条件,则将
s_i
在遍历整个
合法括号序列计数¶
考虑求出长度为
这同样是卡特兰数的递推式。也就是说
当然,对于变种合法括号序列的计数,方法是类似的。假设有
字典序后继¶
给出合法的括号序列
我们需要找到一个最大的
不妨设当
该算法的时间复杂度是
参考实现
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。
buildLast update and/or translate time of this article,Check the history
editFound smelly bugs? Translation outdated? Wanna contribute with us? Edit this Page on Github
peopleContributor of this article sshwy
translateTranslator of this article Visit the original article!
copyrightThe article is available under CC BY-SA 4.0 & SATA ; additional terms may apply.