給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 n = 3,生成結果為:
[「((()))」,
「(()())」,
「(())()」,
「()(())」,
「()()()」
]思考:
首先這道題還算是簡單,因為括號只有倆種可能,左括號和右括號,因此,不要把題目複雜化為所有的排列組合。首先第一步,是先找出所有的括號的組合的可能性,第二步加限制條件,組成有效括號。
現在思考所有括號的組合的可能性,那麼也就是2**n次方自然而然的聯想到我們之前的求子集的方法,使用遞迴+回溯,但是有乙個需要改變的是,我們求子集,是從0開始到最後,也就是子集的長度,是從0到最大的,而我們這裡求所有組合的可能性,子集的長度為固定的,那麼如何對**進行改進呢。我們可以設計乙個初始的字串,長度等於n,把每個i位置放置括號,在回溯的時候新增到res集合裡
如下
def
fun(n)
:#設計乙個長度為2 * n的字串
item =
'2222'
res =
i=0 back(item,res,i,n)
return res
defback
(item,res,i,n)
:if i ==
2* n:
tem = item
return
back(item[
:i]+
'('+ item[i+1:
],res,i+
1,n)
back(item[
:i]+
'('+ item[i+1:
],res,i+
1,n)
執行這段**你會發現,結果並不是像我們想象的那樣,而是所有的都為』((()'這種,是因為python不支援字串的copy,導致所有的item都是相同的。
更改**如下:
def
fun1
(n):
item =
'' result =
back1(item,result,n)
return result
defback1
(item,result,n):if
len(item)==2
*n:return
back1(item +
'(',result,n)
back1(item +
')',result,n)
上述**,因為要所有最後的結果,所有我們在len(item) == 2*n的條件下加入item。
現在所有可能性遍歷出來了,開始加入我們的限制條件,括號合法,什麼是括號合法呢?
1.首先右括號不能再左括號之前
2.有左括號才能加又括號
**如下
def
fun(n)
: left = n
right = n
res =
back(left,right,item,res)
return res
defback
(left,right,item,res)
:if left ==
0and right ==0:
return
if left >0:
back(left -
1,right,item +
'(',res)
if left < right:
back(left,right-
1,item+
')',res)
LeetCode22 括號生成
題幹 給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 演算法思想 先看括號匹配,既然要達到括號匹配,就一定要滿足stack的操作 不多說 則組合數的結果則是卡特蘭數。要輸出正確組合數,可採用遞迴,用兩個變數l,r分別表示剩餘左...
leetcode 22 括號生成
給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 要把這個當成下棋,左括號為黑,右括號為白,則轉換為 3黑3白有幾種排列方式 每一步都有兩個選擇 下黑或者下白,但是場上下白子時剩下的黑子必須比剩下的白子多 比n 2時,有黑白黑白...
leetcode 22 括號生成
給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 參考官方題解 方法二 回溯法 只有在序列仍然保持有效才會新增 如果還有位置,我們可以開始放乙個左括號。如果不超過右括號數量不超過左括號的數量可以放乙個右括號。class solu...