22. 括號生成
難度中等980收藏分享切換為英文關注反饋
數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且有效的括號組合。
示例:
輸入:n = 3
輸出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
對於當前長度為m的括號串,在字元之間有m+1個空隙,而每個空隙中插入乙個『()』都有可能組成乙個新的括號串,
這樣當已經有乙個括號個數為k的括號串的時候,通過這種方式就能得出括號數為k+1的括號串。
當然這種方法會產生較多重複情況,需要進行排除,並且時空開銷並不優秀。
class
solution
:def
generateparenthesis
(self, n:
int)
-> list[
str]
: self.ansset =
set(
) self.generatebyn(
'', n)
return
list
(self.ansset)
defgeneratebyn
(self, cur, n)
:if n ==0:
self.ansset.add(cur)
return
for i in
range
(len
(cur)+1
):array =
list
(cur)
array.insert(i,
'()'
) self.generatebyn(
''.join(array)
, n -
1)
執行結果:通過
執行用時 :2004 ms, 在所有 python3 提交中擊敗了5.58%的使用者
記憶體消耗 :13.9 mb, 在所有 python3 提交中擊敗了6.06%的使用者
最終看到時間開銷確實也不低,但是可以稍作優化。
class
solution
:def
generateparenthesis
(self, n:
int)
-> list[
str]
: self.ansset =
set(
) self.generatebyn(
'', n)
return
list
(self.ansset)
defgeneratebyn
(self, cur, n)
:if n ==0:
self.ansset.add(cur)
return
curset =
set(
)for i in
range
(len
(cur)+1
):array =
list
(cur)
array.insert(i,
'()'
) curset.add(
''.join(array)
)for newcur in curset:
self.generatebyn(newcur, n -
1)
執行結果:通過
執行用時 :332 ms, 在所有 python3 提交中擊敗了5.58%的使用者
記憶體消耗 :13.8 mb, 在所有 python3 提交中擊敗了6.06%的使用者
可以看到,時間上優化了不少,但是不得不承認,這種方法並不優秀,但是可以起到乙個拓展思路的作用。
這種思路的核心思想就是:
長的括號串可以由短的括號串拼接或者外套括號組成,
短的括號串可以由更短的括號串拼接或者外套括號組成,
這樣遞迴下來,最終所有的括號串都會追溯到n=1的括號串,簡化問題。
若要計算n個括號的括號串,以下用dp[k] 表示k個括號組成的有效括號串集合
首先定義dp[1] = ['()']
之後計算dp[2],dp[3]....dp[n]
以下為計算dp[k]的過程:
第1組操作:
分別從dp[1]和dp[k - 1]中取出乙個括號串,將其拼接即可得到長度為k的括號串,並計算所有可能的組合
將dp[1]中每個字串左右各加k-1層單括號
第2組操作
分別從dp[2]和dp[k - 2]中取出乙個括號串,將其拼接即可得到長度為k的括號串,並計算所有可能的組合
將dp[2]中每個字串左右各加k - 2層單括號
······
···第k-1組操作
分別從dp[k - 1]和dp[1]中取出乙個括號串,將其拼接即可得到長度為k的括號串,並計算所有可能的組合
將dp[k - 1]中每個字串左右各加1層單括號
由於整個過程是對稱的,所以每次對兩個字串進行拼接時只考慮 左+右 一種方式即可
class
solution
:def
generateparenthesis
(self, n:
int)
-> list[
str]
: dpmap =
for num in
range(2
, n +1)
: ansset =
set(
)for half in
range(1
, num)
: ansset = ansset|
ansset = ansset|
dpmap[num]
=list
(ansset)
return dpmap[n]
執行結果:通過
執行用時 :44 ms, 在所有 python3 提交中擊敗了58.40%的使用者
記憶體消耗 :14.2 mb, 在所有 python3 提交中擊敗了6.06%的使用者
22 括號生成
參考回溯法 1.class solution def init self self.ans list defgenerateparenthesis self,n int self.parenthesisiter n,0,return self.ans list defparenthesisiter ...
22 括號生成
給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 在leetcode中有關括號的題共有三道,除了這一道的另外兩道是valid parentheses 驗證括號和longest valid parentheses 最長有效括號,這...
22 括號生成
插空法對於乙個 可以把另乙個 插到它的任意乙個空位,形成新的組合。此處有3個空位,但插在頭部和尾部是重複的,所以要注意去重,可以用set class solution object def generateparenthesis self,n res set for i in range n 1 t...