zoukankan      html  css  js  c++  java
  • 22. Generate Parentheses生成指定个括号

    生成指定个数的括号,这些括号可以相互包括,但是一对括号的格式不能乱(就是配对的一个括号的左括号要在左边,右括号要在右边)

    思维就是从头递归的添加,弄清楚什么时候要添加左括号,什么时候添加右括号

    有点像二叉树的建立过程

    /*
        思路是从第一个符号开始添加,只有两种情况,一种是添加左括号,一种是添加右括号
        判断好两种添加的条件后向后添加就行:
        1.当左边括号不超过括号数n时可以添加左括号
        2.当右括号不超过左括号时可以添加右括号
        用递归依次向下添加就行
        由于这种数据结构比较像二叉树,代码使用二叉树写的,其实完全不需要用二叉树。
         */
        //这里不能写public,要不LeetCode不给通过
        class TreeNode {
            public StringBuilder val;
            public TreeNode left;
            public TreeNode right;
            public TreeNode(StringBuilder str) { val = str; }
        }
        List<String> res = new ArrayList<>();
        public List<String> generateParenthesis(int n) {
            if (n < 1)
                return new ArrayList<>();
            StringBuilder s = new StringBuilder("(");
            TreeNode tree = new TreeNode(s);
            helper(tree,n*2);
            return res;
        }
        public TreeNode helper(TreeNode tree,int n)
        {
            //判断是不是添加完了
            StringBuilder temp = tree.val;
            if (temp.length()>=n)
            {
                res.add(new String(temp));
                return null;
            }
            //统计左右括号数
            int l = 0;
            int r = 0;
            for (int i = 0; i < temp.length(); i++) {
                if (temp.charAt(i)=='(')
                    l++;
                if (temp.charAt(i)==')')
                    r++;
            }
            //注意这里一定要新建,如果把temp直接赋给left和right的话,他们三个其实是指向同一个堆内存
            StringBuilder left = new StringBuilder(temp);
            StringBuilder right = new StringBuilder(temp);
            left.append('(');
            right.append(')');
            //添加条件
            if (r < l)
            {
                tree.right = helper(new TreeNode(right),n);
    
            }
            if (l < n/2)
            {
                tree.left = helper(new TreeNode(left),n);
            }
            return tree;
        }
  • 相关阅读:
    Mac-Mysql忘记root密码
    spring 定时任务配置
    MD5 加密
    java io流 图片和字符串之间的转换
    httpclient 无信任证书使用https
    java对象转换成json
    Maven仓库 国内镜像
    大数据与批量调度的紧密关系
    开源Datax、Sqoop、Kettle等ETL工具作业自动化实现-分享
    ETL作业调度工具TASKCTL的两个重大突破
  • 原文地址:https://www.cnblogs.com/stAr-1/p/8245351.html
Copyright © 2011-2022 走看看