22 括號生成

2021-10-02 13:10:13 字數 2652 閱讀 9600

給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。

例如,給出 n = 3,生成結果為:

[「((()))」,

「(()())」,

「(())()」,

「()(())」,

「()()()」

]

思路:36 ms 13.3 mb.參考:回溯演算法-深度優先遍歷

class

solution

:def

generateparenthesis

(self, n:

int)

-> list[

str]

: ans=

defdfs

(left,right,tmp)

:if left==n and right==n:

return

if leftdfs(left+

1,right,tmp+

"(")

if rightdfs(left,right+

1,tmp+

")")

dfs(0,

0,"")

return ans

1.首先基於遞迴的模板考慮如何生成括號,但是不考慮合法性。

class

solution

:def

generateparenthesis

(self, n:

int)

:def

helper

(curlevel, maxlevel, res)

:# terminator

if curlevel >= maxlevel:

# filter

print

(res)

return

# process

res1 = res +

"(" res2 = res +

")"# drill down

helper(curlevel +

1, maxlevel, res1)

helper(curlevel +

1, maxlevel, res2)

# reverse state

helper(0,

2* n,"")

# 自頂向下的程式設計思想:僅僅關注當前層的邏輯

2.考慮限制條件

(1)left < n;才可以繼續新增left

(2)right < left;才可以繼續新增right

這樣的話就需要統計左右括號的數量。因為引數curlevel 和maxlevel的作用其實可以通過左右括號的數量和n來替代,所以進行修改。

class

solution

:def

generateparenthesis

(self, n:

int)

:# 內部函式

defhelper

(left, right,maxn, res)

:# terminator

if left==maxn and right== maxn:

print

(res)

return

# process and drill down

if leftres1 = res +

"(" helper(left +

1,right,maxn, res1)

if rightres2 = res +

")" helper(left,right+

1, maxn, res2)

# reverse state

helper(0,

0,n,"")

so = solution(

)so.generateparenthesis(

3)

輸出結果:

(((

)))(

()()

)(()

)()(

)(()

)()(

)()

3.最後修改為題目需要的輸出

使用列表來儲存每個符合要求的答案

class

solution

:def

generateparenthesis

(self, n:

int)

: ans =

defhelper

(left, right,maxn, res)

:if left==maxn and right== maxn:

return

if lefthelper(left +

1,right,maxn, res +

"(")

if righthelper(left,right+

1, maxn, res +

")")

helper(0,

0,n,"")

return ans

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