題目
數字 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