• Leetcode题目22.括号生成(动态规划-中等)


    题目描述:

    给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

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

    [
    "((()))",
    "(()())",
    "(())()",
    "()(())",
    "()()()"
    ]

    题目解析:动态规划

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

    思路:
    当我们清楚所有 i<n 时括号的可能生成排列后,对与 i=n 的情况,我们考虑整个括号排列中最左边的括号。
    它一定是一个左括号,那么它可以和它对应的右括号组成一组完整的括号 "( )",我们认为这一组是相比 n-1 增加进来的括号。

    那么,剩下 n-1 组括号有可能在哪呢?

    这里是重点,请着重理解

    剩下的括号要么在这一组新增的括号内部,要么在这一组新增括号的外部(右侧)。

    既然知道了 i<n 的情况,那我们就可以对所有情况进行遍历:

    "(" + 【i=p时所有括号的排列组合】 + ")" + 【i=q时所有括号的排列组合】

    其中 p + q = n-1,且 p q 均为非负整数。

    事实上,当上述 p 从 0 取到 n-1,q 从 n-1 取到 0 后,所有情况就遍历完了。

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

    代码实现:

    LinkedList<LinkedList<String>> result = new LinkedList<>();
            if (n == 0) {
                return new LinkedList<>();
            }
            LinkedList<String> list0 = new LinkedList<>();
            list0.add("");
            result.add(list0);
            LinkedList<String> list1 = new LinkedList<>();
            //当n=1时,只有一组括号
            list1.add("()");
            result.add(list1);
            for (int i = 2; i <= n; i++) {
                LinkedList<String> temp = new LinkedList<>();
                for (int j = 0; j < i; j++) {
                    List<String> str1 = result.get(j);
                    List<String> str2 = result.get(i - 1 - j);
                    for (String s1 : str1) {
                        for (String s2 : str2) {
                            String el = "(" + s1 + ")" + s2;
                            temp.add(el);
                        }
                    }
    
                }
                result.add(temp);
            }
            return result.get(n);
  • 相关阅读:
    Project Euler 389 Platonic Dice (概率)
    单纯形(相关题目)
    关于C++中的内存泄露
    莫比乌斯反演与积性函数求和筛法中的一些细节
    清华集训2015-Day 2
    bzoj3456-城市规划
    多项式运算的一些技术
    bzoj2302-Problem c
    bzoj4300-绝世好题
    bzoj4726-Sabota?
  • 原文地址:https://www.cnblogs.com/ysw-go/p/11771118.html
Copyright © 2020-2023  润新知