给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
思路
首先递归列举全部可能的排序结果,因为每次选择左括号或是右括号,为二叉树形结构,再对二叉树进行剪枝,减少不必要的递归
观察例子可得:
- 剪枝1:当前递归中,左括号的数量大于右括号的数量,才能放右括号
- 剪枝2:左括号大于0才能放左括号
class Solution {
public:
vector<string> generateParenthesis(int n) {
string item;
vector<string> result;
dfs(n,n,"",result);
return result;
}
void dfs(int left,int right,string item,vector<string> &result){
if(left==0&&right==0){
result.push_back(item);
return;
}
if(left>0)
dfs(left-1,right,item+"(",result);
if(left<right)
dfs(left,right-1,item+")",result);
}
};