括號生成

 

給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。

例如,給出 n = 3,生成結果爲:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

code

void generate1(int n,int pairNum,vector<string>&v,string str){
    //)的數量不可能多於(的數量;(或)的數量都不會超過括號的對數;
    if(count(str.begin(),str.end(),'(')<count(str.begin(),str.end(),')'))return;
    if(count(str.begin(),str.end(),'(')>pairNum or count(str.begin(),str.end(),')')>pairNum)return;

    if(n==0){
        v.push_back(str);
        str="";
    }
    else{
        for(int i =0;i<2;i++){
            string temp=str;
            if(i==0)str+='(';
            else str+=')';
            //設置temp和下面++n都是爲了回到這層時能夠保證n,str的值爲當時的值
            //但是完全可以改爲:generate(n-1,pairNum,v,str+'(')
            generate(--n,pairNum,v,str);
            ++n;
            str=temp;
        }
    }
}

void generate2(int n,int pairNum,vector<string>&v,string str){
    if(count(str.begin(),str.end(),'(')<count(str.begin(),str.end(),')'))return;
    if(count(str.begin(),str.end(),'(')>pairNum or count(str.begin(),str.end(),')')>pairNum)return;

    if(n==0)v.push_back(str);

    else{
        for(int i =0;i<2;i++){
        //不改變n和str在改層的值
            if(i==0)generate2(n-1,pairNum,v,str+'(');
            else generate2(n-1,pairNum,v,str+')');
        }
    }
}

void generate3(int n,int pairNum,vector<string>&v,string str){
    //)的數量不可能多於(的數量;(或)的數量都不會超過括號的對數;
    if(count(str.begin(),str.end(),'(')<count(str.begin(),str.end(),')'))return;
    if(count(str.begin(),str.end(),'(')>pairNum or count(str.begin(),str.end(),')')>pairNum)return;

    if(n==0)v.push_back(str);

    else{
        //每個位置只有兩種可能,直接寫,沒必要用for,當每個位置可能性很多是用for
            generate3(n-1,pairNum,v,str+'(');
            generate3(n-1,pairNum,v,str+')');

    }
}

validation

//上面的生成方法即可生成正確的括號序列,下面額外提供驗證是否正確的代碼
//驗證中)> (則不平衡,最終balance也必然爲0,不存在其他情況
public boolean valid(char[] current) {
        int balance = 0;
        for (char c: current) {
            if (c == '(') balance++;
            else balance--;
            if (balance < 0) return false;
        }
        return (balance == 0);
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章