[LeetCode]Generate Parentheses

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

For example, given n = 3, a solution set is:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]


本题难度medium。我采用的是树的方法(与Letter Combinations of a Phone Number 差不多的思路 ),采用递归进行先序遍历。注意的是需要进行“剪枝”:

   设ln代表左括号的个数,rn代表右括号的个数。
   当 ln>n||rn>n-1||ln<rn 时,都需要剪枝。
   之所以是rn>n-1而不是n,是因为最后的一定是右括号。

剪枝不仅仅是提高了运行效率,同时也是在递归中必须要时刻进行检查看是否违反规则。代码如下:

public class Solution {
    public List<String> generateParenthesis(int n) {
        //require
        List<String> ans=new ArrayList<String>();
        if(n<1)
            return ans;
        int ln=1,rn=0;
        //invariant
        fun(ln,rn,n,"(",ans);
        //ensure
        return ans;
    }

    public void fun(int ln,int rn,int n,String father,List<String> ans){
        //bound
        if(ln>n||rn>n-1||ln<rn)return;
        if(ln+rn==2*n-1){
            ans.add(father+")");
            return;
        }

        String son=father+"(";
        fun(ln+1,rn,n,son,ans);
        son=father+")";
        fun(ln,rn+1,n,son,ans);
    }
}

discuss中有一个解法,与这个类似,写法更加简洁。
Easy java solution

public class Solution {
    private void helper(List<String> res, String present, int left, int right) {
        if (right == 0) {
            res.add(present);
        }
        if (left > 0) {
            helper(res, present + "(", left - 1, right);
        }
        if (right > left) {
            helper(res, present + ")", left, right - 1);
        }
    }
    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<String>();
        if (n == 0) {
            return res;
        }
        helper(res, "", n, n);
        return res;
    }
}

【后记】
我本打算写个循环版本来提高效率,不过还是放弃了。问题在于对于每一次循环,都需要从前一次循环的结果集中提取字符串及其相应的左右括号个数,如果每次都进行现场计算效率太差,如果结果集使用map又浪费空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值