每天一题LeetCode【第19天】

T22. Generate Parentheses【Medium

题目

给定 n 对圆括号,写一个函数来生成正确形式的括号的所有组合。

例如,给出 n=3 ,一个解集是:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

思路

这个代码的思路很简单,就是分类讨论的感觉,正确的括号组合满足下列两个条件:
的数量一定小于max

的数量小于等于 的数量

设( 的数量为 open,)的数量为 close ,

当 open < max 且 close = open时 后面只能加 (, 例如 str="()" 时

当 open < max 且 close < open时 后面既能加 ( 也能加 ),例如 str="()(" 时

代码

代码取自 Top Solution,稍作注释

public List<String> generateParenthesis(int n) {
        List<String> list = new ArrayList<String>();
        backtrack(list, "", 0, 0, n);
        return list;
    }
    
    public void backtrack(List<String> list, String str, int open, int close, int max){
        //若长度达到 max*2 说明完整了,加入到 list 里面
        if(str.length() == max*2){
            list.add(str);
            return;
        }
        //当 open<max 时可以添加 (,并 open+1
        if(open < max)
            backtrack(list, str+"(", open+1, close, max);
        //当 close < open 时可以添加 ),并 close+1
        if(close < open)
            backtrack(list, str+")", open, close+1, max);
    }

补充

这里方法中传参 list 传递了 list 的地址,两个 list 指向同一块区域,所以改了任意一个,另一个也会改~

想具体了解一下 java 参数传递,我看了这个 blog: http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,020评论 25 708
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,768评论 0 33
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 17,909评论 2 36
  • 创建数组 通过一个数字参数,创建指定长度的数组 通过一个非数字参数 或 多个参数创建一个拥有元素的数组 通过直接量...
    欧阳小龙虾阅读 241评论 0 0
  • 早上,故事叫早儿子,儿子慢悠悠地穿衣服,我心里有些着急、烦躁,忍不住去提醒了几次时间,好在没有过多催促,只是告...
    出尘水阅读 205评论 0 0