[Leetcode解題] Generate Parentheses - Backtrace解

11 February 2022
medium recursion backtrace apple

題目

22. Generate Parentheses

解題思路

給定 n 對括號,寫一個函數來生成所有形成良好括號的組合。

這個問題可以使用回溯的方法解決。我們使用一個列表存儲所有形成良好括號的組合,並使用一個遞歸函數生成所有組合。

遞歸函數需要三個參數:

  • s 是當前括號組合;
  • left 和 right 分別是當前開啟和關閉括號的數量; 如果 len(s) == 2 * n,則代表我們已經使用了所有的 n 對括號,所以我們將此組合添加到列表中。

如果 left < n,則代表我們可以添加開啟括號。所以,我們調用 backtrack,傳遞參數 s + ‘(‘,left + 1 和 right。

如果 right < left,則代表我們可以添加關閉括號。所以,我們調用 backtrack,傳遞參數 s + ‘)’,left 和 right + 1。

最後,我們不傳任何參數調用 backtrack 以開始生成組合。

實作

以下是一個使用回溯法的 Python 解決方案:

def generateParenthesis(n):
    res = []
    def backtrack(s = '', left = 0, right = 0):
        if len(s) == 2 * n:
            res.append(s)
            return
        if left < n:
            backtrack(s + '(', left + 1, right)
        if right < left:
            backtrack(s + ')', left, right + 1)

    backtrack()
    return res

複雜度

此題目的時間複雜度是 $O(4^n/\sqrt{n})$,其中 $n$ 是括號對數。

這是因為對於每個括號對數,最多有 $2n$ 個括號,因此,最多有 $4^n$ 種組合方案。然而,由於有些組合不合法,因此,真正的組合數比 $4^n$ 小。根據 Catalan Number 的計算,真正的組合數是 $C_{n}^{2n} / (n+1)$,因此,真正的時間複雜度是 $O(4^n/\sqrt{n})$。