GenerateParenthes
给定一个数n,排列出所有可以成对的组合()
例如:n=3
((( )))
(()())
(())()
()()()
()(())
先不说程序(越来越懒了哈),说说这个问题的思想。
所有满足条件的结果应有以下特点:
设两个变量leftnum,rightnum表示剩余的左右括号,
其中,leftnum= rightnum = n,
n>= rightnum >= leftnum
想到的是递归(循环),从n开始递减;
generate(leftnum- 1, rightnum);
generate(leftnum, rightnum – 1);
实际上leftnum= 0时,递归就可以结束了,因为此时只能够选择right括号了。
不会出现只剩下leftnum的情况。
generate(leftnum,rightnum)
{
if(leftnum== 0)
return;
generate(leftnum- 1, rightnum);
generate(leftnum, rightnum – 1);
}
怎么一直保证leftnum>= rightnum呢?这个问题想了好久,印象中好像没有这个方法。
参考网上方法,有个巧妙的方法
添加一个判断 leftnum< rightnum,
generate(leftnum,rightnum)
{
if(leftnum== 0 && rightnum == 0)
return; // 递归停止条件 剩余的左右个数为0
if(leftnum> 0)
generate(leftnum- 1, rightnum); // 先递减leftnum,保证减少比较次数
if(rightnum>0 && leftnum < rightnum) //技巧:利用判断条件,保证题目的条件成立
generate(leftnum, rightnum – 1);
}