题目

思路
该题是属于回溯法类型的题目,题意是给出n代表要生成的括号数,求所有有效形式的括号组合
首先我们先分析回溯递归的终止条件:比较直观的是括号数目达到了所给定的数目规定,但是一个括号会有左边和右边,如果不能很好的把握他们之间的顺序关系,那么就可能会造成输出不是有效形式的括号,那么我们如何把握保证输出的结果都是有效形式的呢?
我们可以分别设置两个变量left,right分别表示目前所使用的左括号/右括号数量,所以我们递归的基准条件此时就变为:left/right大于括号数时返回。我们还需要特别注意的是:左括号一定比右括号先用完,换句话说,左括号数目一定要小于等于右括号数,所以当右括号数目大于左括号时,此时将不能得到有效形式的括号组合,所以我们递归条件还需要加上左括号和右括号之间的这个隐藏关系
相关代码为:
class Solution {
public:
vector<string> res;
vector<string> generateParenthesis(int n) {
if (n == 0)return res;
dfs( n, "",0, 0);
return res;
}
void dfs( const int n,string str,int left,int right) {
if (left > n || right > n||right>left)return;
if (left == n && right == n) {
res.push_back(str);
return;
}
dfs(n, str + '(', left + 1, right);
dfs(n, str + ')', left, right + 1);
}
};
1286

被折叠的 条评论
为什么被折叠?



