LC 22回溯中等第 62 / 95 题

括号生成

Generate Parentheses

回溯剪枝
本机进度仅保存在当前浏览器

题目描述

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

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

解题思路

  1. 把"合法"翻译成可执行的剪枝条件:任意前缀中左括号数不少于右括号数,且最终两者相等。
  2. 维护已用左括号数 l 与右括号数 r:l < n 时可以放左括号,r < l 时可以放右括号,其他分支全部剪掉。
  3. 路径长度达到 2n 即收集;剪枝保证生成的每个前缀都合法,无需事后校验。

参考实现

查看参考实现Python · 建议先自行作答
def generateParenthesis(n):
    res, path = [], []

    def backtrack(l, r):
        if len(path) == 2 * n:
            res.append(''.join(path))
            return
        if l < n:
            path.append('(')
            backtrack(l + 1, r)
            path.pop()
        if r < l:
            path.append(')')
            backtrack(l, r + 1)
            path.pop()

    backtrack(0, 0)
    return res

复杂度与归属

时间复杂度O(卡特兰数 · n)
空间复杂度O(n)
所属分类回溯
题源LeetCode 22

关联教程

返回题图鉴