LeetCode-Algorithms-[Mid]22. 括号生成(面试题 08.09. 括号)

括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。

说明:解集不能包含重复的子集。

例如,给出 n = 3,生成结果为:

[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bracket-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


第一种是遍历的思路:

    int n;
    List<String> list;

    public List<String> generateParenthesis(int n) {
        initial(n);
        dfs("", 0, 0);
        return this.list;
    }

    private void dfs(String s, int left, int right) {
        if (left + right == 2 * n) {
            list.add(s);
            return;
        }
        if (right > left) {
            return;
        }
        if (left < n) {
            dfs(s + "(", left + 1, right);
        }
        if (right < n) {
            dfs(s + ")", left, right + 1);
        }
    }

    private void initial(int _n) {
        this.n = _n;
        this.list = new ArrayList<>();
    }

方法二:dp思路

以下引用:【最简单易懂的】动态规划

反思:
首先,面向小白:什么是动态规划?在此题中,动态规划的思想类似于数学归纳法,当知道所有 i 本题最核心的思想是,考虑 i=n 时相比 n-1 组括号增加的那一组括号的位置。

思路:
当我们清楚所有 i 它一定是一个左括号,那么它可以和它对应的右括号组成一组完整的括号 “( )”,我们认为这一组是相比 n-1 增加进来的括号。
那么,剩下 n-1 组括号有可能在哪呢?

【这里是重点,请着重理解】
剩下的括号要么在这一组新增的括号内部,要么在这一组新增括号的外部(右侧)。
既然知道了 i “(” + 【i=p时所有括号的排列组合】 + “)” + 【i=q时所有括号的排列组合】
其中 p + q = n-1,且 p q 均为非负整数。
事实上,当上述 p 从 0 取到 n-1,q 从 n-1 取到 0 后,所有情况就遍历完了。

注:上述遍历是没有重复情况出现的,即当 (p1,q1)≠(p2,q2) 时,按上述方式取的括号组合一定不同。

作者:yuyu-13
链接:https://leetcode-cn.com/problems/generate-parentheses/solution/zui-jian-dan-yi-dong-de-dong-tai-gui-hua-bu-lun-da/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    //dp
    public List<String> generateParenthesis_2(int n) {
        List<String> dpInitialState = new ArrayList<>();
        dpInitialState.add("");
        List<List<String>> dp = new ArrayList<>();
        dp.add(dpInitialState);
        for (int i = 1; i <= n; i++) {
            List<String> tempList = new ArrayList<>();
            for (int j = 0; j < i; j++) {
                List<String> bracketInsideList = dp.get(j);
                List<String> bracketOutsideList = dp.get(i - 1 - j);
                for (String sInside : bracketInsideList) {
                    for (String sOutside : bracketOutsideList) {
                        String temp = "(" + sInside + ")" + sOutside;
                        tempList.add(temp);
                        dp.add(i, tempList);
                    }
                }
            }
        }
        return dp.get(n);
    }

你可能感兴趣的:(LeetCode-Algorithms-[Mid]22. 括号生成(面试题 08.09. 括号))