LeetCode: 22.括號生成

題目

數字 n 代表生成括號的對數,請你設計一個函數,用於能夠生成所有可能的並且 有效的 括號組合.

輸入:n = 3
輸出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

思路

這道題和判斷是否是有效的括號字符串,都是和括號打交道的。我們可以基於判斷是否是有效括號字符串的解法做。

暴力法

用回溯生成所有組合,依次判斷是否是有效括號字符串(總長度爲2*n)。判讀的解法我之前做過,用棧或者一個變量記錄左括號的數目即可。
當然有化簡的暴力法

化簡的暴力法

不用對每一個組合都去判斷一次。我們只要在遞歸的過程中,確保生成的括號字符串是合法的就行。如何確保是合法的呢?

  • 只有在左括號的數目小於n的情況下,才能添加一個左括號
  • 只有在右括號的數目小於左括號的數目的情況下,才能添加一個右括號
class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        ans = []
        def walk(i, temp, left, right):
            if i == 2*n:
                ans.append(''.join(temp))
                return 
            if left < n:
                temp.append('(')
                walk(i+1, temp, left+1, right)
                temp.pop()
            if right < left:
                temp.append(')')
                walk(i+1, temp, left, right+1)
                temp.pop()

        walk(0, [], 0, 0)
        return ans

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章