给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路
递归
我们需要明白以下三点:
-
一个问题的解可以分解为几个子问题的解:对于这个括号生成的题,当
n=3
时问题的解可以分成n=2
时问题的解; -
子问题除了数据规模不同,求解思路完全一样:对于这个括号生成的题,当
n=3
时问题的解的解思路和n=2
时问题的解的解思路完全一样,只是问题规模减小了; -
必须存在递归终止条件:对于这个括号生成的题,我们需要使用两个变量
left
和right
来记录可使用的左括号数和右括号数,如当n=3
时,初始化left=3
和right=3
,当left>right
时说明可以使用的左括号数大于可以使用的右括号数,即已经使用的右括号数比左括号数多,则会出现无效的括号对数,因此left>right
可作为本题的递归终止条件。还有当left<0
或right<0
也是递归终止条件。 -
为什么
left>right可以作为递归终止条件,因为 (()))此时已经无法通过后续操作使其变成一个有效的括号组合
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
helper(n,n,"", res);
return res;
}
void helper(int left, int right, string out, vector<string>& res){
//递归终止条件
if(left < 0 || right < 0 || left > right)
{
return;
}
if(left == 0 && right == 0){
res.push_back(out);
return;
}
//减少问题规模
helper(left-1, right, out+'(', res);
helper(left, right-1, out+')', res);
}
};