美文网首页
每天一题LeetCode【第19天】

每天一题LeetCode【第19天】

作者: 草稿纸反面 | 来源:发表于2017-02-08 00:06 被阅读85次

    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

    相关文章

      网友评论

          本文标题:每天一题LeetCode【第19天】

          本文链接:https://www.haomeiwen.com/subject/grxvittx.html