給出 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);
}