思路:
这个题目其实看了别人的代码。当然只是匆匆扫了一眼,并没有看仔细。
其实包含的思想是有剪枝的穷尽
我们可以定义两个变量一个记录还有多少个(另一个变量记录还有多少个)
那么,下面的递归就是穷尽所有的可能
help(prev+"(", open-1, close);
help(prev+")",open,close-1);
当open==close==0时。代表所有的()都用完了,需要添加到结果里面。
需要剪枝的情况
1open 和close为负数。
2close的数目小于open。。这时候产生的结果可能是这样())等等,因为)的数量必须必(小。
思考为啥open小于close就可以呢?因为这是代表(的数量多于),只要在接下来的递归产生)进行配对就好。。
public class Solution {
List<String> result=new LinkedList<String>();
public List<String> generateParenthesis(int n) {
help("", n, n);
return result;
}
public void help(String prev,int open,int close)
{
if(open<0||close<0||close<open)
{
return;
}
if(open==0&&close==0)
{
result.add(prev);
}
help(prev+"(", open-1, close);
help(prev+")",open,close-1);
}
}