题目:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
有效的括号组合就是指:
1.插入数量不超过n
2.可以插入 ) 的前提是 ( 的数量大于 )
我们可以把整个过程理解为一个二叉树,左子树为增加左括号,右子树为增加右括号 。当左括号数量小于右括号时,那就这能增加左括号了,也就是只有左子树。如果左括号已经没有了,那就只能增加右括号,也就是只有右子树。左右括号都没有了,那就是没有子树了。最后看一下有多少叶子结点就是多少种方案。本文通过深度优先搜索来遍历二叉树寻找有多少叶子结点,代码如下。
vector<string> generateParenthesis(int n)
{
vector<string > st;
string s;
ges(n,n,st,s);
return st;
}
void ges(int leftnum,int rightnum,vector<string>&st,string s)
{
if(leftnum==0&&rightnum==0)
st.push_back (s);
if(leftnum>0)
ges(leftnum-1,rightnum,st,s+'(');
if(rightnum>0&&leftnum<rightnum)
ges(leftnum,rightnum-1,st,s+')');
}