题目
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]
示例 2:
输入:n = 1
输出:[“()”]
提示:
1 <= n <= 8
链接
代码
括号序列类型 的题目需要满足的条件
1.任意序列中的左括号数量>=右括号数量,只有当前缀序列中左括号数量>右括号数量时,才可以给序列添加右括号
2.最终序列中,左右括号数量相等
class Solution {
public:
vector<string> ans;
vector<string> generateParenthesis(int n) {
dfs("",n, n, n);//dfs求解符合的答案
return ans;
}
// str:当前的序列 n:括号对数 lCnt: 左括号剩余个数 rCnt:右括号剩余个数
void dfs(string str,int n, int lCnt, int rCnt){
// 如果左括号和右括号都用完了,则添加结果
if(lCnt == 0 && rCnt == 0) {
ans.push_back(str);
return;
}
// 如果还有左括号可用,则给序列添加左括号,并且左括号数量减1
if(lCnt) dfs(str+'(',n, lCnt-1, rCnt);
// 如果序列中的左括号数量大于右括号数量,则可用给序列添加右括号
if(n - lCnt > n - rCnt) dfs(str+')', n, lCnt, rCnt-1);
}
};