22. 括号生成 - 力扣(LeetCode)
题目描述
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
样例输入
示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1 输出:["()"]
提示:
1 <= n <= 8
如下图,当n=2时,每种可能的情况都有4个字符,使用递归遍历出所有可能的情况:
剪去递归过程中不符合题意的条件,可以看出以下情况,应当进行剪枝
- 左括号数量<右括号数量
- 左括号数量>n
而当路径收集过程中path.size(),也就是最终的结果等于2n时,应该进行收集
题解
class Solution {
private:
string path;
vector<string> res;
void backing(int n,int l,int r)
{
if(l>n || l<r) return;
if(path.size()==2*n)
{
res.push_back(path);
return;
}
path+='(';
backing(n,l+1,r);
path.pop_back();
path+=')';
backing(n,l,r+1);
path.pop_back();
}
public:
vector<string> generateParenthesis(int n) {
backing(n,0,0);
return res;
}
};
或
class Solution {
private:
vector<string> res;
void backing(string path,int n,int l,int r)
{
if(l>n || l<r) return;
if(path.size()==2*n)
{
res.push_back(path);
return;
}
backing(path+'(',n,l+1,r);
backing(path+')',n,l,r+1);
}
public:
vector<string> generateParenthesis(int n) {
backing("",n,0,0);
return res;
}
};