卡特兰数——generate-parentheses 打印成对的括号

原创 2016年06月01日 22:39:46

题目描述:给定一个非负整数n,生成n对括号的所有合法排列。

解答:

该问题解的个数就是卡特兰数,但是现在不是求个数,而是要将所有合法的括号排列打印出来。

       该问题和《编程之美》的买票找零问题一样,通过买票找零问题我们可以知道,针对一个长度为2n的合法排列,第1到2n个位置都满足如下规则:左括号的个数大于等于右括号的个数。所以,我们就可以按照这个规则去打印括号:假设在位置k我们还剩余left个左括号和right个右括号,如果left>0,则我们可以直接打印左括号,而不违背规则。能否打印右括号,我们还必须验证left和right的值是否满足规则,如果left>=right,则我们不能打印右括号,因为打印会违背合法排列的规则,否则可以打印右括号。如果left和right均为零,则说明我们已经完成一个合法排列,可以将其打印出来。通过深搜,我们可以很快地解决问题。


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:

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


递归代码如下:

import java.util.*;
public class Solution {
    public ArrayList<String> generateParenthesis(int n) {
        ArrayList<String> list=new ArrayList<String>();
        if(n < 1)
            return list;
        int left=n;
        int right=n;
        String s="";//
        help(left,right,s,list);
        return list;
    }
    public void help(int left,int right,String s,ArrayList<String> list)
        {
        if(left == 0&&right == 0)
            {
            list.add(s);
            return;
        }
        if(left > 0)
            {
            help(left-1,right,s+'(',list);
        }
        if(right>0&&left < right)
            {
            help(left,right-1,s+")",list);
        }
    }
}
错误代码:

将String s 换成StringBuilder sb:

import java.util.*;
public class Solution {
    public ArrayList<String> generateParenthesis(int n) {
        ArrayList<String> list=new ArrayList<String>();
        if(n < 1)
            return list;
        int left=n;
        int right=n;
        StringBuilder sb=new StringBuilder();//将String s="";换成StringBuilder sb=new StringBuilder()出错;
        help(left,right,sb,list);
        return list;
    }
    public void help(int left,int right,StringBuilder sb,ArrayList<String> list)
        {
        if(left == 0&&right == 0)
            {
            list.add(sb.toString());
            return;
        }
        if(left > 0)
            {
            help(left-1,right,sb.append('('),list);//原因是,StringBuilder sb作为参数经过help函数执行后,sb内容已经发生改变。
        }
        if(right>0&&left < right)
            {
            
            help(left,right-1,sb.append(')'),list);
        }
    }
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

求和问题总结(leetcode 2Sum, 3Sum, 4Sum, K Sum)

前言: 做过leetcode的人都知道, 里面有2sum, 3sum(closest), 4sum等问题, 这些也是面试里面经典的问题, 考察是否能够合理利用排序这个性质, 一步一步得到高效的算法....
  • doc_sgl
  • doc_sgl
  • 2013年10月09日 00:15
  • 17863

(Java)LeetCode-18. 4Sum

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = t...

[C++]LeetCode: 84 Generate Parentheses (卡特兰数)

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

卡特兰数——括号匹配问题

卡特兰数的递推公式是F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)} 一般性公式为F(n)=C(2n,n)/(n+1) 可以描述的问...

【卡特兰数】有N对括号,输出所有合法的组合

这道题也算是很经典的了,属于一个基本原理题,深刻理解了这种题,也就理解了一大堆相似的问题。 分析:n对括号,那么位置0出现的括号必然是“(”,和它配对的“)”可能出现在1,3,5,。。。。2n-1的...

【算法】卡特兰数问题(BST排列个数,矩阵乘法,算数加括号,排队等)

卡特兰数当年大二时候就知道了其在行走路线问题上面的应用,后来发现其还有更多的应用场景,而且最近做LeetCode也碰见了不少这样的问题,特此总结一番。 本篇未完,待续 96. Unique Bi...

Leetcode刷题记——22. Generate Parentheses(生成括号)

一、题目叙述: Given n pairs of parentheses, write a function to generate al...

从《编程之美》买票找零问题说起,娓娓道来卡特兰数——兼爬坑指南

引子:   大约两个月前,我在练习一些招聘的笔试题中,有一道和卡特兰数相关。那时还没来得及开始仔细看《编程之美》,就先翻到那一章节,草草地看了下买票找零的例子和证明并把书上的 背下来了事...

卡特兰数——单调路径证明(HDU2067)

Description 小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望。不过没过几天发现了棋盘的好玩之处。从起点(0,0)走到终点(n,n...
  • sisaku
  • sisaku
  • 2016年03月01日 23:09
  • 466
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:卡特兰数——generate-parentheses 打印成对的括号
举报原因:
原因补充:

(最多只允许输入30个字)