22 括號生成 回溯法及其模板

2022-05-17 07:39:09 字數 1033 閱讀 4603

判斷回溯很簡單,拿到乙個問題,你感覺如果不窮舉一下就沒法知道答案,那就可以開始回溯了。

一般回溯的問題有三種:

find a path to success 有沒有解

find all paths to success 求所有解

求所有解的個數

求所有解的具體資訊

find the best path to success 求最優解

回溯法是乙個剪枝了的二叉樹。我們要得到的結果是可以 good leaf,如果不滿足 good leaf 就繼續向下搜尋,搜尋的時候需要滿足一定的條件。

那麼我們在什麼情況下新增左括號呢?很明顯,最多能新增 n 個左括號,在遞迴呼叫的時候,在能傳遞到最底層的共用字串中先新增 」(「 ,然後 left-1,遞迴呼叫就可以。

那什麼時候新增右括號呢?當左括號個數大於右括號的個數時新增右括號。

總之,向下搜尋要滿足兩個條件:

插入數量不超過n

可以插入 ) 的前提是 ( 的數量大於 )

回溯法的**套路是使用兩個變數: res 和 path,res 表示最終的結果,path 儲存已經走過的路徑。如果搜到乙個狀態滿足題目要求,就把 path 放到 res 中。

**後面的判斷條件都是 if,而不是 elif,因為是滿足兩個條件的任意乙個就可以繼續向下搜尋,而不是同時只能滿足其中的乙個。

使用c++,基本結構和上面一樣,不過這裡 lc 和 rc 分別表示左括號的個數和右括號的個數。vector的push_back()方法呼叫的時候實際上是使用的值傳遞,也就是會進行賦值到vector裡。

class

solution

void dfs(vector& res, string path, int n, int lc, int

rc)

dfs(res, path + '

(', n, lc + 1

, rc);

dfs(res, path + '

)', n, lc, rc + 1

); }

};

view code

22 括號生成(回溯)

由於前幾道題剛剛做過括號匹配的題,而且要求是生成括號,也就是列舉括號,想到了回溯法,所以看到這道題首先想到了使用回溯法並且用棧來輔助生成有效的括號。結果並沒有寫出來,問題出在回溯的時候撤銷選擇,撤銷 的時候要把棧頂的 也恢復了,這一步沒能實現。方法解答的思路很清楚,而且容易理解 使用回溯法列舉所有的...

leetcode 22 括號生成 暴力法和回溯法

數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且 有效的 括號組合。示例 輸入 n 3 輸出 方法一 暴力法 相當於填滿2n個字元陣列,如果填滿後符合括號規則,則新增到答案中,每個位置都有選和不選兩種選擇,所以總共有2 2n個選擇,同時每個選擇還需要有o n 去判斷是否符合...

leetcode 22 括號生成 回溯

對待這種問題,千萬別暴力搜尋,那樣太笨了。方法一 執行用時 20 ms,在generate parentheses的c 提交中擊敗了67.40 的使用者 記憶體消耗 18.9 mb,在generate parentheses的c 提交中擊敗了14.83 的使用者 第乙個想到的是回溯法。每一次判別就o...