题目:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路:
因为所有的括号都是小括号,所以只要满足左括号后面的右括号数量和左括号的数量相等就好了。这里用递归的思路可以很好的解决。left表示还剩余的左括号个数,right表示⽬目前需要的右括号数,一开始left = n,right = 0;当 left还剩余左括号数⼤大于0的时候,添加左括号,并将left – 1,right + 1;当right⽬目前还需要的右括号 数⼤大于0的时候,添加右括号,并将right – 1,当left和right都等于0的时候,表示当前是⼀一个符合格 式条件的字符串串,将该字符串串cur放⼊入result数组中,后返回result。
代码:
class Solution {
public:
vector<string> generateParenthesis(int n) {
dfs("", n, 0);
return result;
}
private:
vector<string>result;
void dfs(string cur, int left, int right)
{
if (left == 0 && right == 0)
{
result.push_back(cur);
return;
}
if (left > 0) dfs(cur + "(", left - 1, right + 1);
if (right > 0)dfs(cur + ")", left, right - 1);
}
};