括号生成需要出现成对的括号(有效的括号)
例如:给出n = 3,则生成的结果是
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
给定n的值,左边的括号"("数量一定会小于n,当然右边的括号")"数量也一定小于n,左边的值加一,则打印一个"(",右边的值加一,打印一个")",当左括号和右括号的数量等于n时,那就打印所有的括号。
上图的黑线是第一次打印的调用,知道打印“((()))”,然后绿线是栈帧回退的路线,回退到红线出发的位置,红线开始打印,直到打印“(()())”,依次继续调用,后面没有画。
下面结合代码看就简单多了
void fun(int left,int right,vector<string> &res,string tmp,int n)
{
if(left == n && right == n)
{
res.push_back(tmp);
}
if(left < n)
{
fun(left + 1,right,res,tmp+'(',n);
}
if(left > right)
{
fun(left,right + 1,res,tmp+')',n);
}
}
vector<string> generateParenthesis(int n) {
vector<string> res;
fun(0,0,res,"",n);
return res;
}