leetcode每日一题-「括号生成」

113 阅读1分钟

【题目标题】

括号生成

【题目描述】

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 有效括号组合需满足:左括号必须以正确的顺序闭合。

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

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

提示: 1 <= n <= 8

【解题思路】

【动态规划法】

【代码实现】

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> resultOf0 = new ArrayList<>();
        resultOf0.add("");
        List<String> resultOf1 = new ArrayList<>();
        resultOf1.add("()");
        List<List<String>> resultList = new ArrayList<>();
        resultList.add(resultOf0);
        resultList.add(resultOf1);
        for (int i = 2; i <= n; i++) {
            resultList.add(getResultOfI(resultList, i));
        }
        return resultList.get(n);
    }

    private List<String> getResultOfI(List<List<String>> resultList, int i) {
        List<String> resultOfI = new ArrayList<>();
        for (int leftIndex = 0; leftIndex <= i - 1; leftIndex++) {
            List<String> resultOfOneResultOfI = getResultOfOneResultOfI(resultList, leftIndex, i - 1 - leftIndex);
            resultOfI.addAll(resultOfOneResultOfI);
        }
        return resultOfI;
    }

    private List<String> getResultOfOneResultOfI(List<List<String>> resultList, int leftIndex, int rightIndex) {
        List<String> resultOfOneResultOfI = new ArrayList<>();
        List<String> resultOfLeftIndex = resultList.get(leftIndex);
        List<String> resultOfRightIndex = resultList.get(rightIndex);
        for (int m = 0; m < resultOfLeftIndex.size(); m++) {
            for (int n = 0; n < resultOfRightIndex.size(); n++) {
                resultOfOneResultOfI.add("(" + resultOfLeftIndex.get(m) + ")" + resultOfRightIndex.get(n));
            }
        }
        return resultOfOneResultOfI;
    }
}