22 括號生成

2022-06-22 05:30:14 字數 1803 閱讀 2797

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

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

[

"((()))",

"(()())",

"(())()",

"()(())",

"()()()"

]

思路很簡單,生成所有可能的結果,從中篩選出有效的新增到列表中,最後將列表返回即可。

此思路有兩個問題要解決,第乙個是如何判斷有效,第二個是如何生成括號序列。

判斷有效

前面的第 20 題已經解決了括號匹配問題,而且是多種括號的形式,該問題只有一種括號,所以可以使用更簡單的方法:判斷左右括號數量是否相等。

暴力生成所有字串

首先判斷字串長度是否為 2*n ,如果是就判斷是否有效,否則就新增 '()' 或者 ')' ,遞迴呼叫該生成函式,並 pop 出不合格的字元。

class solution:

def generateparenthesis(self, n):

""":type n: int

:rtype: list[str]

"""def generate(l = ):

"""生成序列

:param l:

:return:

"""# 序列長度為2*n,判斷是否有效

if len(l) == 2 * n:

if valid(l):

else:

# 長度不夠就繼續新增

# 遞迴呼叫generate生成,無效就將最後的pop出來

generate(l)

l.pop()

generate(l)

l.pop()

def valid(l):

"""校驗是否有效

:param l:

:return:

"""is_valid = 0

for i in l:

if i == '(':

is_valid += 1

else:

is_valid -= 1

if is_valid < 0:

return false

return is_valid == 0

ret =

generate()

return ret

關鍵點:通過控制左右括號數量生成有效序列,只有在我們知道序列仍然保持有效時才新增 '(' 或者 ')' 。子函式可以以當前括號序列+左括號數量+右括號數量為引數,利用遞迴生成所有有效的括號序列。

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