📜  生成括号 (1)

📅  最后修改于: 2023-12-03 15:27:08.555000             🧑  作者: Mango

生成括号

生成括号是一道经典的算法问题,其本质是要求我们找到所有 n 对括号的有效组合。

有效组合是指所有左右括号配对都正确的组合,例如对于 n=3,有效组合有如下 5 种:

  • "((()))"
  • "(()())"
  • "(())()"
  • "()(())"
  • "()()()"
思路

这道题的解法,可以使用递归和回溯算法来实现。具体思路如下:

  1. 定义一个递归函数,用来生成括号;
  2. 在递归函数中,需要定义两个计数器 left 和 right,分别表示左右括号的数量;
  3. 递归的过程中,对于每一个左括号 "(",我们将 left 计数器减 1,继续递归;
  4. 对于每一个右括号 ")",需要满足 right < left,并且 right 计数器减 1,继续递归;
  5. 当 left 和 right 都等于 n 时,表示已经生成了一组有效的括号序列,将其记录到结果集中。
代码实现

下面是一个使用 Python 语言实现的递归和回溯算法代码实现。其中,generate_parenthesis 函数是递归函数,而 helper 函数是用来实现回溯的辅助函数。

def generate_parenthesis(n):
    """
    :type n: int
    :rtype: List[str]
    """
    def helper(cur, left, right):
        """
        :type cur: str
        :type left: int
        :type right: int
        """
        if left == n and right == n:
            res.append(cur)
            return
        if left < n:
            helper(cur + '(', left + 1, right)
        if right < left:
            helper(cur + ')', left, right + 1)
    
    res = []
    helper("", 0, 0)
    return res
时间复杂度

计算递归算法的时间复杂度需要考虑递归层数和每层的操作次数。对于本题,递归层数和左右括号的总数都是 n,因此时间复杂度为 O(2^n)。