由於前幾道題剛剛做過括號匹配的題,而且要求是生成括號,也就是列舉括號,想到了回溯法,所以看到這道題首先想到了使用回溯法並且用棧來輔助生成有效的括號。結果並沒有寫出來,問題出在回溯的時候撤銷選擇,撤銷")"的時候要把棧頂的"("也恢復了,這一步沒能實現。
方法解答的思路很清楚,而且容易理解:使用回溯法列舉所有的可能,終止條件是當前字串的長度和要生成括號的對數的2倍相等,表明此時得到了乙個符合要求的括號。做選擇的分為兩種情況,每一種情況都有乙個條件。選擇左括號的前提是,只要已選擇的左括號數量小於要求生成括號的對數,就可以選擇。選擇右括號的前提是,只有已選擇的右括號數量小於已選擇的左括號數量同時也要小於要求生成括號的對數,則選擇右括號。選擇完畢之後遞迴。如果當前層執行完畢則回溯當上一層準備撤銷選擇,將當前層形成的字串序列中最後乙個字元刪除即可完成撤銷選擇。
**如下:
class solution
public void backtrack(stringbuilder cur, arraylistresult, int open, int close, int n)
if ( open < n )
if ( close < n && close < open )
}
}
stringbuilder型別的字串建立的方法為,要new出乙個stringbuilder物件。 leetcode 22 括號生成 回溯
對待這種問題,千萬別暴力搜尋,那樣太笨了。方法一 執行用時 20 ms,在generate parentheses的c 提交中擊敗了67.40 的使用者 記憶體消耗 18.9 mb,在generate parentheses的c 提交中擊敗了14.83 的使用者 第乙個想到的是回溯法。每一次判別就o...
LeetCode 中等 回溯 22 括號生成
數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且 有效的 括號組合。示例 輸入 n 3 輸出 class solution public void generateall char current,int pos,list result else 判斷是否是符合題目要求的有...
22 括號生成 回溯法及其模板
判斷回溯很簡單,拿到乙個問題,你感覺如果不窮舉一下就沒法知道答案,那就可以開始回溯了。一般回溯的問題有三種 find a path to success 有沒有解 find all paths to success 求所有解 求所有解的個數 求所有解的具體資訊 find the best path ...