22. 括号生成

53 阅读1分钟

22. 括号生成 - 力扣(LeetCode)] 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

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

示例 2:

输入: n = 1
输出: ["()"]
class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> ans = new ArrayList<String>();
        backtrack(ans, new StringBuilder(), 0, 0, n);
        return ans;
    }

    public void backtrack(List<String> ans, StringBuilder cur, int open, int close, int max) {
        if (cur.length() == max * 2) {
            // 若cur的长度已达到2max,则已经是满足要求的一条答案,加入ans
            ans.add(cur.toString());
            return;
        }

        if (open < max) {
            // 统计正反括号的数量,若少于max,说明可继续添加
            cur.append('(');
            backtrack(ans, cur, open + 1, close, max);
            cur.deleteCharAt(cur.length() - 1);
            // 回溯,删去最后一个符号,探索其他的后续搭配
        }

        // 反括号需满足数量不超过正括号的数量,由于正括号的判断只和max有关,且先于反括号的判断,所以不存在前缀中反括号的数量更多的情况
        if (close < open) {
            cur.append(')');
            backtrack(ans, cur, open, close + 1, max);
            cur.deleteCharAt(cur.length() - 1);
        }
    }
}

// 回溯法
// 先添加正括号,递归正括号中能添加就添加