數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且 有效的 括號組合。
示例:輸入:n = 3
輸出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]該題目也是利用回溯法的經典題目,與**號碼的字母組合十分類似,重要的是畫出深度優先搜尋樹,並找到路徑和可選列表。
用 left, right 表示可選列表,sb 記錄當前的路徑。
如果 left == 0 && right == 0 說明到達了葉子結點,儲存答案,return。
如果 left == right && left > 0, 是圖中紅線情況,只能新增乙個左括號。
如果 left < right && left > 0, 是圖中的藍線情況,可以新增乙個左括號,也可以新增乙個右括號。
如果 left == 0 && right > 0, 是圖中綠線情況,只能新增乙個右括號。
left = 0left > 0
right = 0right > 0right = leftright > left
return新增 )
新增 (
新增 (、 )
class solution
// left 記錄當前可用左括號的數目,right 記錄當前可用右括號的數目
private void permute(listres, stringbuilder sb, int left, int right)
if (left == right) else if (left < right && left > 0) else
}private void doleft(listres, stringbuilder sb, int left, int right)
private void doright(listres, stringbuilder sb, int left, int right)
}
left = 0left > 0right = 0right > 0(left)right = leftright > leftreturn新增 )新增 (新增 (、 )
由上面的**,可以發現,left 只要大於 0,就可以新增左括號;只要 right > left, 就可以新增右括號。
所以將**可以簡化成:
class solution
// left 記錄當前可用左括號的數目,right 記錄當前可用右括號的數目
private void permute(listres, stringbuilder sb, int left, int right)
if (left > 0)
if (left < right) }}
更多關於回溯法的內容見刷題模板。 LeetCode22 括號生成
題幹 給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 演算法思想 先看括號匹配,既然要達到括號匹配,就一定要滿足stack的操作 不多說 則組合數的結果則是卡特蘭數。要輸出正確組合數,可採用遞迴,用兩個變數l,r分別表示剩餘左...
leetcode 22 括號生成
給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 要把這個當成下棋,左括號為黑,右括號為白,則轉換為 3黑3白有幾種排列方式 每一步都有兩個選擇 下黑或者下白,但是場上下白子時剩下的黑子必須比剩下的白子多 比n 2時,有黑白黑白...
leetcode 22 括號生成
給出 n 代表生成括號的對數,請你寫出乙個函式,使其能夠生成所有可能的並且有效的括號組合。例如,給出 n 3,生成結果為 參考官方題解 方法二 回溯法 只有在序列仍然保持有效才會新增 如果還有位置,我們可以開始放乙個左括號。如果不超過右括號數量不超過左括號的數量可以放乙個右括號。class solu...