首页 > 其他 > 详细

Generate Parentheses -- LeetCode

时间:2014-02-25 19:59:13      阅读:316      评论:0      收藏:0      [点我收藏+]
原题链接: http://oj.leetcode.com/problems/generate-parentheses/ 

这道题其实是关于卡特兰数的,如果只是要输出结果有多少组,那么直接用卡特兰数的公式就可以。关于卡特兰数,请参见卡特兰数-维基百科,里面有些常见的例子,这个概念还是比较重要的,因为很多问题的原型其实都是卡特兰数,大家可以看看。特别是其中

bubuko.com,布布扣

这个递推式的定义,很多这类问题都可以归结成这个表达式。这个题对于C的定义就是第一对括号中包含有几组括号。因为第一组括号中包含的括号对数量都不同,所以不会重复,接下来就是一个递归定义,里面又可以继续用更小的C去求组合可能性。
说完卡特兰数的内容,我们来看看这个具体问题怎么解决。一般来说是用递归的方法,因为可以归结为子问题去操作。在每次递归函数中记录左括号和右括号的剩余数量,然后有两种选择,一个是放一个左括号,另一种是放一个右括号。当然有一些否定条件,比如剩余的右括号不能比左括号少,或者左括号右括号数量都要大于0。正常结束条件是左右括号数量都为0。算法的复杂度是O(结果的数量),因为卡特兰数并不是一个多项式量级的数字,所以算法也不是多项式复杂度的。代码如下: 

public ArrayList<String> generateParenthesis(int n) {
    ArrayList<String> res = new ArrayList<String>();
    if(n<=0)
        return res;
    helper(n,n,new String(),res);
    return res;
}
private void helper(int l, int r, String item, ArrayList<String> res)
{
    if(r<l)
        return;
    if(l==0 && r==0)
    {
        res.add(item);
    }
    if(l>0)
        helper(l-1,r,item+"(",res);
    if(r>0)
        helper(l,r-1,item+")",res);
}
这道题目主要考查的是递归思想的实现,当然如果可以看透背后是一个卡特兰数的模型,会更好一些。

Generate Parentheses -- LeetCode

原文:http://blog.csdn.net/linhuanmars/article/details/19873463

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!