首页 > 其他 > 详细

22. 括号生成

时间:2021-06-09 21:46:26      阅读:21      评论:0      收藏:0      [点我收藏+]

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

 

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:

输入:n = 1
输出:["()"]

解法一:递归    教会我程序是一步步完善的,有时候不要想着一蹴而就

List<String> res = new ArrayList<>();

    public List<String> generateParenthesis(int n) {
        generate(0, 0, n, "");
        return res;

    }

    void generate(int left, int right, int n, String str) {
        // TODO 自动生成的方法存根
        if (left == n && right == n) {
            res.add(str);
            return;
        }

        if (left < n)
            generate(left + 1, right, n, str + "(");
        if (right < left && right < n)
            generate(left, right + 1, n, str + ")");
    }

解法二:暴力求解也行,就是加了个对数据的检验    实时检查指的是在数据还没有完全生成的时候,每次添加做一个检查;还是做一个功能包,就是等数据都生成好了,做一个检查

public List<String> generateParenthesis(int n) {
        List<String> combinations = new ArrayList<String>();
        generateAll(new char[2 * n], 0, combinations);
        return combinations;
    }

    public void generateAll(char[] current, int pos, List<String> result) {
        if (pos == current.length) {
            if (valid(current)) {
                result.add(new String(current));
            }
        } else {
            current[pos] = ‘(‘;
            generateAll(current, pos + 1, result);
            current[pos] = ‘)‘;
            generateAll(current, pos + 1, result);
        }
    }

    public boolean valid(char[] current) {
        int balance = 0;
        for (char c: current) {
            if (c == ‘(‘) {
                ++balance;
            } else {
                --balance;
            }
            if (balance < 0) {
                return false;
            }
        }
        return balance == 0;
    }
}

解法三:

22. 括号生成

原文:https://www.cnblogs.com/xiaoming521/p/14867480.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!