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

题目描述:java

给出 n 表明生成括号的对数,请你写出一个函数,使其可以生成全部可能的而且有效的括号组合。算法

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

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

题目解析:动态规划code

首先,面向小白:什么是动态规划?在此题中,动态规划的思想相似于数学概括法,当知道全部 i<n 的状况时,咱们能够经过某种算法算出 i=n 的状况。
本题最核心的思想是,考虑 i=n 时相比 n-1 组括号增长的那一组括号的位置。blog

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

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

这里是重点,请着重理解class

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

既然知道了 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);
相关文章
相关标签/搜索