题目描述
数字 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;
}
};
本文介绍了一种生成所有可能有效括号组合的算法,通过递归和剪枝优化,以解决给定括号数量n的问题。代码实例展示了如何在Solution类中使用vector存储结果并实现func函数进行递归调用。
489

被折叠的 条评论
为什么被折叠?



