22.Generate Parentheses (String; Back-Track)

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:

"((()))", "(()())", "(())()", "()(())", "()()()"

思路:两个递归函数,互相调用

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        if(n==0) return ret;
        
        dfsLeft("",0,0,n);
        return ret;
    }
    
    void dfsLeft(string s, int depthLeft, int depthRight, int n){ //add one left parenthesis
        if(depthLeft >= n){ //end left
            return;
        }
        else{
            s += '(';
            depthLeft++;
            dfsRight(s,depthLeft, depthRight, n);
            dfsLeft(s,depthLeft, depthRight, n);
        }
    }
   
    void dfsRight(string s, int depthLeft, int depthRight, int n){ //add one right parenthesis
        if(depthRight >= n){ //end all
            ret.push_back(s);
        }
        else if(depthRight >= depthLeft){ //end right
            return;
        }
        else{
            s += ')';
            depthRight++;
            dfsLeft(s,depthLeft, depthRight, n);
            dfsRight(s,depthLeft, depthRight, n);
        }
    }
private:
    int len;
    vector<string> ret;

};

更简洁的写法:

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        if(n == 0) return ret;
        
        len = n*2;
        dfsLeft(n, 0, "");
        return ret;
    }
    
    void dfsRight(int lNum, int rNum, string str){//add right parenthese
        while(rNum){ 
            str += ')';
            dfsLeft(lNum, --rNum, str);
        }
        if(str.length() == len){
            ret.push_back(str);
        }
    }
    
    void dfsLeft(int lNum, int rNum, string str){//add left parenthese
        while(lNum){
            str += '(';
            dfsRight(--lNum, ++rNum, str);
        }
    }
private:
    int len;
    vector<string> ret;

};
原文地址:https://www.cnblogs.com/qionglouyuyu/p/4705551.html