Generate Parentheses 生成括号-- LintCode题解

越往后就越难,加油。

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

Example

Given n = 3, a solution set is:

"((()))", "(()())", "(())()", "()(())", "()()()"

然后,没有思路。

下面引用,谢谢。

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


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


import java.util.ArrayList;

/**
 * Created by Administrator on 2016/4/29.
 */
public class GenerateParentheses {
    public static void main(String[] args) {
        int n = 3;
        ArrayList<String> arrayList = generateParenthesis(n);
        for (String s : arrayList) {
            System.out.print(s + ",");
        }
    }
    public static ArrayList<String> generateParenthesis(int n) {
        ArrayList<String> ans = new ArrayList<String>();
        if (n == 0) return ans;
        String s = new String();
        helper(n, n, s, ans);
        return ans;
    }

    /***
     * r为右括号个数,l为左括号个数
     * @param l
     * @param r
     * @param s
     * @param res
     */
    public static void helper(int l, int r, String s, ArrayList<String> res) {
        if (r < l) return;
        if (l == 0 && r == 0) {
            res.add(s);
        }
        if (l > 0) helper(l - 1, r, s + "(", res);
        if (r > 0) helper(l, r - 1, s + ")", res);
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值