Leetcode 22 括號生成

2021-10-07 12:38:29 字數 1865 閱讀 9915

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