括号生存 leetcode 22

2.代码及注释

class Solution {
public:
    //存放结果的容器,初始化为空
    vector<string> ans{};
    //回溯算法 left为'('的个数 right为')'的个数,s为当前的字符串,k为当前字符串的长度,n为目标字符串的长度。
    void back_track(string s,int k,int n,int left,int right){
        /*
        回溯剪枝
        由有效的括号组成性质可知
        1.左右括号个数各占总体的一半,如果左右括号个数超出一半则必定是无效的
        2.左括号个数必定是大于右括号个数的
        */
        if(left>n/2||right>n/2) return ;
        if(right>left) return ;
        //当进行到最后一个时,则认为是有效的括号,并加入容器
        if(k==n){
            ans.push_back(s);
        }else{
            
            string temp = s;
            //添加'('
            s+='(';
            back_track(s,k+1,n,left+1,right);
            //添加')'
            s=temp+')';
            back_track(s,k+1,n,left,right+1);
        }
        return ;
    }
    vector<string> generateParenthesis(int n) {
        if(n==0) return {""};
        back_track("(",1,n*2,1,0);
        return ans;
    }
};
posted @ 2020-01-02 18:16  谋莽台  阅读(129)  评论(0编辑  收藏  举报