题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
class Solution {
public:
vector<string> generateParenthesis(int n) {
}
};
解
- 本题类似于17题电话号码的字母组合,在此基础上,如果不满足条件 ,提前停止递归,即剪枝。
剪枝的条件为:左括号的数目一旦小于右括号的数目,
以及,左括号的数目或右括号数目一旦大于n。
以下的代码来自评论区,写的相当简洁:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
func(res, "", 0, 0, n);
return res;
}
void func(vector<string> &res, string str, int l, int r, int n){
if(l > n || r > n || r > l) return ;
if(l == n && r == n) {res.push_back(str); return;}
func(res, str + '(', l+1, r, n);
func(res, str + ')', l, r+1, n);
return;
}
};