22 括號生成

2021-10-05 12:00:33 字數 3282 閱讀 9220

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