卡塔兰数应用----所有括号的组合

 vector<string> generateParenthesis(int n) {
        vector<string> ans;
        string s;
        if (n>0) generator(ans, s, 0, 0, n);
        return ans;
    }
    // l/r: number of '(' / ')'
    void generator(vector<string> & ans, string s, int l, int r, int n) {
        if (l == n) {
            ans.push_back(s+string().assign(n-r, ')'));
            return;
        }
        generator(ans, s+'(', l+1, r, n);
        if (l>r) generator(ans, s+")", l, r+1, n);
    }


  1. void genPar(vector<char> &vt,int sum, int beg, int end, int acc) {  
  2.    //第0位置肯定放(,那么和这个左括号匹配的右括号可能的位置是2*i+1,然后按照此类方法再去处理括号里面的元素和括号外面的元素  
  3.      
  4.    vt[beg] = '(';  
  5.    ++acc;  
  6.    if (beg + 1 == end && acc +1 == sum){  
  7.        vt[end] = ')';  
  8.   
  9.        for (int j=0; j< sum; ++j)  
  10.            cout<<vt[j];  
  11.        cout<<endl;  
  12.        return;  
  13.   
  14.    }  
  15.     for(int i = beg + 1; i<= end; i +=2 ) {  
  16.         int tmp = acc;  
  17.          
  18.         vt[i] = ')';  
  19.           
  20.         if (i - beg >=3)  
  21.             genPar(vt,sum,beg+1, i - 1,acc + 1);  
  22.          
  23.         if (end - i >=2)  
  24.             genPar(vt, sum, i+1,end,acc + i -beg );  
  25.   
  26.     }  
  27.   
  28. }  
  29.   

  30. int main() {  
  31.      
  32.     int n =3;  
  33.       
  34.     vector<char> vt(2*n);  
  35.     int acc = 0;  
  36.    genPar(vt,2*n,0,2*n - 1,acc);  
  37.   
  38.    /*vector<char> vt(6); 
  39.     par(3,3,vt,0);*/  
  40.       
  41.   
  42. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值