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;}
};