leetcode-回溯-22

题面

image-20201226102441302

重点

见源代码注释部分

源代码(重点在注释部分)

初级阶段

class Solution {
public:
    //用递归实现回溯算法
    //这里的&就是把C中的指针简化一下
    void  digui(string & temp,int n,vector<string> & result){
        if(temp.size() == 2*n){
            if(valid(temp)){
                result.push_back(temp);
            }
            return;
        }
        //“有进必有出”
        temp.push_back('(');
        digui(temp,n,result);
        temp.pop_back();
        temp.push_back(')');
        digui(temp,n,result);
        temp.pop_back();

    }
    //判断当前的括号序列是否合法
    bool valid(string temp){
        int len = temp.size();
        int balance = 0;
        //遇到左括号,balance++;遇到右括号,balance--
        for(int i=0; i<len; i++){
            if(temp[i]=='('){
                balance++;
            }
            else{
                balance--;
            }
            //如果某一时刻右括号多于左括号,直接不合法
            if(balance<0){
                return false;
            }
        }
        //必须左括号和右括号相同才行,左括号多于右括号也不行
        return balance==0;

    }
    vector<string> generateParenthesis(int n) {
        vector<string> result;
        string temp;
        digui(temp,n,result);
        return result;

    }
};

高级阶段

class Solution {
public:
    //用递归实现回溯算法
    //这里的&就是把C中的指针简化一下
    //left表示当前插入的左括号的数量,right表示当前插入的右括号的数量
    void degui2(vector<string> & result,string & temp,int left,int right,int n){
        if(temp.size() == 2*n){
            result.push_back(temp);
            return;
        }
        //left<n和right<left谁先判断都可以通过所有测试用例
        //每次加入括号的时候,当前序列一定是合法的
        if(left<n){
            //“有进必有出”
            temp.push_back('(');
            degui2(result,temp,left+1,right,n);
            temp.pop_back();
        }
        //右括号的数量必须始终小于左括号的数量
        if(right<left){
            //“有进必有出”
            temp.push_back(')');
            degui2(result,temp,left,right+1,n);
            temp.pop_back();
        }
    }

    vector<string> generateParenthesis(int n) {
        vector<string> result;
        string temp;
        degui2(result,temp,0,0,n);
        return result;
    }
};


posted on 2021-12-17 20:11  coderabcd  阅读(30)  评论(0)    收藏  举报

导航