回溯演算法 括號生成

2021-10-07 01:33:28 字數 1166 閱讀 4599

22.括號生成

思路:先用回溯演算法生成所有可能的括號,再判斷生成的括號是否為有效括號。

對於有效括號的判斷,leetcode也有一道專門的題,用棧輔助就可以很簡單的解決。整體**也沒啥,就是回溯+有效括號的判斷

class

solution

:def

generateparenthesis

(self, n:

int)

-> list[

str]

: res =

arr =

['('

,')'

] length =

2* n

defis_valid

(s):

#判斷括號是否有效

stack =

#從後向前遍歷,遇到')'就加入棧中,遇到'('就彈出棧頂元素

for i in

range

(length-1,

-1,-

1):if s[i]

==')'

:')'

)else

:if stack:

stack.pop(

)else

:return

false

return

false

if stack else

true

#如果是有效括號,棧最終肯定是空的

defbacktrace

(s):

#回溯部分就沒啥特別的,套模板

iflen

(s)== length and is_valid(s)

:#終止條件

ifnot s in res:

for i in

range(2

):iflen

(s + arr[i]

)> length:

#剪枝break

s += arr[i]

backtrace(s)

s = s[:-

1]backtrace('')

return res

leetcode 生成括號(回溯演算法)

出處 生成括號 給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 從題目尋找三要素 1 選擇 加左括號 加右括號 2 條件 左括號沒有用完 才可以加左括號 右括號數目小於左括號數目 才可以加右括號 3 結束 左右括號均用完 思路...

演算法 回溯法(雙路徑回溯 括號生成)

leetcode 22 括號生成 我想到了兩種思路來解決這個問題 1 先添左括號,沒有左括號,再新增右括號,知道左右括號數量相加等於2倍的n 然後撤銷並重新新增,直到找出所有組合,如圖所示 其實就是能進則進,進不了則換,換不了則退 回溯法。找返回條件 左括號個數 右括號個數 n或者左括號個數 右括號...

回溯演算法最佳實踐 括號生成

22.括號生成 括號問題可以簡單分成兩類,一類是前文寫過的 括號的合法性判斷 一類是合法括號的生成。對於括號合法性的判斷,主要是借助 棧 這種資料結構,而對於括號的生成,一般都要利用回溯遞迴的思想。關於回溯演算法,我們前文寫過一篇 回溯演算法套路框架詳解 反響非常好,讀本文前應該讀過那篇文章,這樣你...