22. 括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
分析:
我们可以将题目转化为:
有一个2*n长度的数组,每一个位置你可以放’(’ 或者 ‘)’。
让你输出其中满足以下两个条件的所有结果:
1:’(’ 和 ‘)’ 都刚好出现n次。
2:满足‘有效的括号组合’这个条件。
对于1,我们只需要使用两个变量left, right 来分别记录 ‘(’ 和 ‘)’ 还要使用的次数。
对于2,要满足‘有效的括号组合’这个条件,只需满足:在任何前缀子串中,’('出现的次数要大于等于 ‘)’ 出现的次数,即left < right。
AC代码:
class Solution {
public:
void dfs(string cur,vector<string>& ans, int left, int right)
{
if(left == 0 && right == 0)
{
ans.push_back(cur);
return;
}
// 放'('
if(left > 0)
{
dfs(cur+'(',ans,left-1,right);
}
// 放')'
if(left < right)
{
dfs(cur+')',ans,left,right-1);
}
}
vector<string> generateParenthesis(int n) {
vector<string> ans;
dfs("",ans,n,n);
return ans;
}
};