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;
    }

 

posted @ 2018-01-08 22:37  stAr_1  阅读(153)  评论(0编辑  收藏  举报