1. 程式人生 > >leetcode題庫——括號生成

leetcode題庫——括號生成

題目描述:

給出 n 代表生成括號的對數,請你寫出一個函式,使其能夠生成所有可能的並且有效的括號組合。

例如,給出 n = 3,生成結果為:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

方法:DFS+剪枝

class Solution {
public:
    int numl=1;
    int numr=0;
    string str="(";
    int deep=1;
    vector<string> s;
    vector<string> ans;
    vector<string> generateParenthesis(int n) 
    {   
        if(n==1)
        {
            ans.push_back("()");
            return ans;
        }
        int num=n;
        s.push_back("(");
        for(int i=1;i<n;i++)
            s.push_back("()");
        dfs(numl,numr,str,n,num);
        return ans;
    }  
    void dfs(int numl,int numr,string str,int n,int num)
    {
        if(deep<2*n-1)
        {
            for(int i=0;i<2;i++)
            {
                if(numl>=numr&&numl<=num)
                {
                    if(i==0) dfs(numl+1,numr,str+s[deep].substr(i,1),deep+1,num);
                    if(i==1) dfs(numl,numr+1,str+s[deep].substr(i,1),deep+1,num);
                }
                else continue;
            }
        }
        if(numl==num&&numr==num) ans.push_back(str);
    }    
};

思路:

首先,將n對括號對應的“搜尋樹” 建立出來,例如:n=3時,建立一個vector<string>s,s=['(','()','()','()','()','()'],這樣,對應的搜尋樹就是這樣:

深搜時,設定兩個計數器,分別記錄左括號和右括號的數量,當i=0時,左括號+1;i=1時,右括號+1。當左括號數量大於3或者左括號數量大於右括號時,進行剪枝(也就是不繼續往下搜尋了,回溯到上一個遞迴中繼續搜尋)。