LeetCode 22 括號生成

2021-10-04 07:19:33 字數 1467 閱讀 7148

給出 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...