括号生成

170 阅读2分钟

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

leetcode 括号生成

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

有效括号组合需满足:左括号必须以正确的顺序闭合。

 

示例 1:

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

示例 2:

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

解题:递归按树形结构依次生成左右括号,再在每个节点下生成左右括号,在生成过程中剔除那些不符合要求的分支,记录下合法的括号组合即可。首先生成一个左括号,然后在左括号下面分别生成左右两个括号两个分支,再在左右括号下分别生成左右括号分支,按分支路径拼接的就是括号组合。当然也不能无限生成下去,并且也不是所有生成的分支都是符合要求的,所以在生成过程中,对不符合要求的就剪除掉。括号要有效得左右括号数量一致,并且得按正确的顺序闭合,括号总对数得等于n,对于不符合这些条件的括号组合就得剔除掉了,符合要求的记录下来,并且也不用在往下生成了(按要求一个分支只有一个合法)。对于这个左右括号形式的树结构,如果前面生成的右括号数量大于左括号,那么这个组合的括号就无法按正确的顺序闭合了的,所以需要剪掉。括号不能无限制生成下去,直到左括号数量大于n时就停止,然后当左右括号对数等于n时就是有效符号要求的括号组合,记录下来,最后依次获取到所有合法的括号组合。

class Solution {
    List<String> parenthesis;
    int totalNum;
    public List<String> generateParenthesis(int n) {
        totalNum = n;
        parenthesis = new ArrayList<>();
        createBrackets("", 0, 0);
        return parenthesis;
    }
    private void createBrackets(String str, int left, int right) {

        // 右括号数量大于左括号数量 或者 左括号数量大于n 肯定不合法了。
        if (right > left || left > totalNum) {
            return;
        }
        // 生成的括号够了
        if (str.length() == totalNum * 2) {
            parenthesis.add(str);
            return;
        }
        // 先创建一个左括号
        createBrackets(str + "(", left + 1, right);
        // 再创建一个右括号
        createBrackets(str + ")", left, right + 1);
    }
}