leetcode22 括號的生成

2021-09-29 16:58:59 字數 1841 閱讀 2937

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