leecode第二十二题(括号生成)

class Solution {
public:
    void is_kuohao(vector<int> temp,int n,vector<string>& result)//检测是不是括号,如果是,就打入result
    {
        bool is_real=true;
        int sum_front=0;
        for(int i=0;i<n;i++)
        {
            if(i>0)
                sum_front+=temp[i-1];
            if(!(temp[i]<=(i+1-sum_front)))//检测条件1:所有左括号后面接的右括号,其个数不能多于前面所有左括号数目
                is_real=false;
        }
        if(temp[n-1]<1)//检测条件2:最后一个一定是右括号
            is_real=false;
        
        if(is_real)//打入result
        {
            string new_item;
            for(int i=0;i<n;i++)
            {
                new_item.push_back('(');
                for(int j=0;j<temp[i];j++)
                    new_item.push_back(')');
            }
            result.push_back(new_item);
        }
    }
    
    void baoli(int retain_vlaue,int num_all,int n,vector<string>& result,vector<int>& temp)//递归生成所有可能的组合
    {
        if(n==0)
            return;
        if(n==1)//终止条件
        {
            temp[0]=retain_vlaue;
            is_kuohao(temp,num_all,result);
            return;
        }
        
        for(int i=retain_vlaue;i>=0;i--)//递归主体
        {
            temp[n-1]=i;
            baoli(retain_vlaue-i,num_all,n-1,result,temp);
        }
        
    }
    
    vector<string> generateParenthesis(int n) {
        vector<string> result;
        vector<int> temp(n,0);
        baoli(n,n,n,result,temp);
        return result;
    }
    
    
    
};

分析:

一开始各种想,没想到好多人推荐的居然是暴力法。。。

原文地址:https://www.cnblogs.com/CJT-blog/p/11174352.html