給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 n = 3,生成結果為:
[「((()))」,
「(()())」,
「(())()」,
「()(())」,
「()()()」
]這種方法是 careercup 書上給的方法,是蠻巧妙的一種方法。
核心思想是找左括號:
每找到乙個左括號,就在其後面加乙個完整的括號,最後再在開頭加乙個 (),就形成了所有的情況,
需要注意的是,有時候會出現重複的情況,所以我們用 set 這種資料結構,好處是如果遇到重複項,不會加入到結果中,最後我們再把 set 轉為 list 即可。
class
solution
:def
generateparenthesis
(self, n:
int)
-> list[
str]
:if n ==0:
return
if n ==1:
return
["()"
]if n ==2:
return
["(())"
,"()()"
] total =[[
"()"],
["(())"
,"()()"]]
for i in
range(1
,n-1):
#注意,取n-1而不要取n,因為取n最後total會生成到n+1個括號的情況,而我們只要n個括號的情況
par =
#用於存放i+1個括號的所有情況
for j in
range
(len
(total[i]))
:#遍歷total中i個括號組成的所有情況
s =total[i]
[j]#取total中i個括號所有情況中的第j個情況
for k in
range
(len
(s))
:#遍歷這個情況下的所有左括號
s_tmp =
list
(s)#s_tmp會變化,所以不要直接用s否則s長度發生變化,導致遍歷失敗,這裡新開乙個s_tmp變數來存放結果
if s[k]
=="("
: s_tmp[k]
="(()"
#遇到左括號就新增乙個完整括號,相當於把"("換成"(()"
"".join(s_tmp)
)#讓s_tmp從列表再轉回字串
"()"
+s)#新增多乙個情況,就是再原來情況下,在前面多加乙個"()"
list
(set
(par)))
#去重return total[n-
1]
LeetCode22 括號生成
題幹 給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 演算法思想 先看括號匹配,既然要達到括號匹配,就一定要滿足stack的操作 不多說 則組合數的結果則是卡特蘭數。要輸出正確組合數,可採用遞迴,用兩個變數l,r分別表示剩餘左...
leetcode 22 括號生成
給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 要把這個當成下棋,左括號為黑,右括號為白,則轉換為 3黑3白有幾種排列方式 每一步都有兩個選擇 下黑或者下白,但是場上下白子時剩下的黑子必須比剩下的白子多 比n 2時,有黑白黑白...
leetcode 22 括號生成
給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 參考官方題解 方法二 回溯法 只有在序列仍然保持有效才會新增 如果還有位置,我們可以開始放乙個左括號。如果不超過右括號數量不超過左括號的數量可以放乙個右括號。class solu...