zoukankan      html  css  js  c++  java
  • 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;
    
    };
  • 相关阅读:
    java学习笔记
    androd Sdk manager配置
    50ms延时程序
    89c51中断入口地址表
    打印杨辉三角--队列的应用
    栈的应用--括号匹配
    哈夫曼编码---数据压缩
    PS转手绘
    数据结构学习思路
    第三届蓝桥杯省赛---第39级台阶
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/4705551.html
Copyright © 2011-2022 走看看