22-生成括號
給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 n = 3,生成結果為:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
生成所有 2^ 個與暴力破解法比較,回溯法不是無腦新增括號生成序列,而是只有當前的序列是平衡的時候,我們才往序列尾部繼續新增'('
和')'
字元構成的序列。然後,我們將檢查每乙個是否有效。為了檢查序列是否為有效的,我們會跟蹤
平衡
,也就是左括號的數量減去右括號的數量的淨值。如果這個值始終小於零或者不以零結束,該序列就是無效的,否則它是有效的。
'('
或者')'
。我們可以維護兩個變數int l
和int 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時,有黑白黑白...