• 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;
    
    };
  • 相关阅读:
    [牛客]十二桥问题 解题报告
    [NOIP2017 逛公园] 解题报告
    [JSOI2008]最小生成树计数 解题报告
    类欧几里得算法
    概率与期望题目列表
    [SCOI2008]配对 解题报告
    拦截导弹
    牛客网-约数的个数
    牛客网-成绩排名
    最大连续区间和的算法总结
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4705551.html
Copyright © 2020-2023  润新知