给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解析:
该题目不同于验证括号的有效性,难度稍微增加了一些。需要用递归的方法,一层层的生成括号,分别增加左右括号数,直到左右括号数都等于n,则将其加入到结果集中。递归结束的条件是左括号数小于右括号数,或左括号数大于n,或左右括号数都等于n。
代码:
class Solution {
public:
void dfs(int l,int r,string has)
{
if(l<r)return;//递归结束条件
if(l>N)return;
if(r==l&&r==N)
{
res.push_back(has);
return;
}
dfs(l+1,r,has+"(");
dfs(l,r+1,has+")");
}
vector<string> generateParenthesis(int n) {
N=n;
if(!N)
return {};
dfs(0,0,"");
return res;
}
private:
vector<string>res;
int N;
};