LeetCode 22 生成括號

2022-05-19 07:03:10 字數 1015 閱讀 9096

22-生成括號

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

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

[

"((()))",

"(()())",

"(())()",

"()(())",

"()()()"

]

生成所有 2^ 個'('')'字元構成的序列。然後,我們將檢查每乙個是否有效。

為了檢查序列是否為有效的,我們會跟蹤平衡,也就是左括號的數量減去右括號的數量的淨值。如果這個值始終小於零或者不以零結束,該序列就是無效的,否則它是有效的。

與暴力破解法比較,回溯法不是無腦新增括號生成序列,而是只有當前的序列是平衡的時候,我們才往序列尾部繼續新增'('或者')'。我們可以維護兩個變數int lint r來記錄當前左括號和右括號的數目,通過左右括號數目的比較,來判斷當前序列是否是平衡的。

如果還有空位,我們可以先放乙個左括號;如果右括號的數目不超過左括號的數目,就新增右括號尋求平衡。

public class generateparentheses 

private void backtrack (listans, string cur, int l, int r, int max)

if (l < max)

backtrack(ans, cur + "(", l + 1, r, max);

if (r < l) // 保證平衡

backtrack(ans, cur + ")", l, r + 1, max);

}}

這一題的回溯演算法思想體現在:某一次遞迴新增括號達到平衡後,需要回到這一次遞迴的頭部,尋找平衡,繼續新增括號。

leetcode 22 生成合法的括號組合

給定n對括號,計算出n對括號的所有合法組合 實現起來非常複雜 將每一種括號的組合放在6個字元大小的陣列中,共會產生22n個組合,時間複雜度位2 2n 如何判斷非法括號組合 從左往後掃瞄,當左括號出現次數少於右括號時即非法,如 還是遞迴,但使用剪枝法來排除產生非法的括號組合 左括號可以隨便新增,最多到...

LeetCode22 括號生成

題幹 給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 演算法思想 先看括號匹配,既然要達到括號匹配,就一定要滿足stack的操作 不多說 則組合數的結果則是卡特蘭數。要輸出正確組合數,可採用遞迴,用兩個變數l,r分別表示剩餘左...

leetcode 22 括號生成

給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 要把這個當成下棋,左括號為黑,右括號為白,則轉換為 3黑3白有幾種排列方式 每一步都有兩個選擇 下黑或者下白,但是場上下白子時剩下的黑子必須比剩下的白子多 比n 2時,有黑白黑白...