@LeetCode括号生成--Generate Parentheses[C++]
问题描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3 n=3 n=3,生成结果为:
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
解决方法及复杂度分析
思路
可以搜索状态空间树来完成这道题,约束条件是右括号数小于等于左括号数。
以
n
=
3
n=3
n=3 为例,状态空间树如下图所示。
在生成状态空间树时,将右括号数大于左括号数的枝自动剪去。利用回溯算法搜索此状态空间树。
在回溯算法中,我们定义两个变量 open、close,分别代表此时左括号数和右括号数。当左括号数 open 小于 n 时,将左括号加入字符串中,当右括号数 close 小于左括号数 open 时,将右括号加入字符串中。在字符串长度达到 2n 时,将字符串压入 vector 容器中。
程序实现
class Solution {
public:
vector<string> generateParentheses(int n) {
vector<string> ans;
backtrack(ans, "", 0, 0, n);
return ans;
}
void backtrack(vector<string>& ans, string cur, int open, int close, int max) {
if (cur.length() == max * 2) {
ans.push_back(cur);
return;
}
if (open < max)
backtrack(ans, cur + "(", open + 1, close, max);
if (close < open)
backtrack(ans, cur + ")", open, close + 1, max);
}
};
@北京·怀柔 2019.3.5