给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
解题思路:用递归的方法,使用掉所有的左括号和右括号,为了保证符合规则,两个放置左右括号的子递归的条件分别是存在左括号和之前有多余的左括号
void putParenthesis(vector<string> &output, string temp, int left, int right)
{
/*1.退出条件,左右括号数量剩余均为0*/
if((left == 0) && (right == 0))
{
output.push_back(temp);
return;
}
/*2.为了保证符合规则,先放左括号*/
if(left > 0)
{
putParenthesis(output, temp + '(', left - 1, right);
}
/*3.后放右括号,除此之外,放右括号的条件是前面有多余左括号,即left< right*/
if(left < right)
{
putParenthesis(output, temp + ')', left, right - 1);
}
}
vector<string> Solution::generateParenthesis(int n)
{
vector<string> output;
if(n == 0)
{
return output;
}
putParenthesis(output, "", n, n);
return output;
}