22.Generate Parentheses[M]括號生成

題目

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n=3, a solution set is:
 [
  "( ( ( ) ) )",
  "( ( ) ( ) )",
  "( ( ) ) ( )",
  "( ) ( ( ) )",
  "( ) ( ) ( )"
 ]python


思路

回溯法

對於\(n\)對有效括號的生成,咱們能夠將其當作如下的方式:函數

![](https://i.loli.net/2019/05/28/5ced1c673eb7529167.jpg)
圖1:回溯法生成括號示意圖
在上圖中,因爲一對有效括號老是從"("開始,因此樹的根節點是"("。將左括號的個數記爲$l$,右括號的個數記爲$r$,給定個數$n$,在生成新括號的過程當中,分爲三種狀況 * $l < n$,說明左括號的個數還有達到目標值,應該增長左括號 * $l > r$,說明右括號的個數不夠多,應該生成右括號 * $r = n$,說明完成$n$對有效括號的生成。

注意在此過程當中,右括號的個數不能超過左括號,若是超過,則不往下進行遞歸。由此完成了一個回溯法的過程:遞歸生成括號,可是在生成括號的同時,檢查左右括號是否匹配。若是匹配,則繼續遞歸;若是不匹配,則不往下遞歸。在具體實現中,經過保證右邊括號的個數\(r\)始終小於等於左邊括號的個數來實現匹配的檢查。spa


Tips

回溯法

基本思想

將問題的解空間轉化爲圖或者樹的結構表示,而後利用深度優先搜索策略進行遍歷,遍歷過程當中記錄和尋找可行解和最優解。.net

基本行爲

回溯法的基本行爲是搜索,在搜索過程當中利用兩種方法來避免無效的搜索code

  • 1.使用約束函數,剪去不知足約束條件的路徑
  • 2.使用限定條件,剪去不能獲得最優解的路徑
    回溯法是一種思想方法,在具體實現中是經過遞歸或者迭代實現。

C++

vector<string> generateParenthesis(int n) {
        
        vector<string> result;  
        
        if(n==0)
            return result;
        
        backTrack(result, "", 0, 0, n);
        
        return result;
    }
    
    void backTrack(vector<string> &res,string curStr,int l, int r, int n){
        
        if(r == n)
            res.push_back(curStr);
        
        //若是左括號沒有達到給定的n
        if(l < n)
            backTrack(res, curStr+"(", l+1, r, n);
        
        //若是右括號數目不夠
        if(r < l)
            backTrack(res, curStr+")", l, r+1, n);
    }

Python

參考

[1]
[2] https://blog.csdn.net/zjc_game_coder/article/details/78520742orm

相關文章
相關標籤/搜索