数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。如果左括号数量不大于 n,我们可以放一个左括号。如果右括号数量小于左括号的数量,我们可以放一个右括号。
示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
ss表示三组括号(),lk为左括号个数初始为1,rk右括号个数,初始为0;
kuo(3,1,0,0){
lk=1;a8=0;a1[0]='(';
a8=1;
kuo(3,2,0,1){
a1[1]='(';a8=2;
kuo(3,3,0,2){
a1[2]=')'; a8=3;
kuo(3,3,1,3){
a1[3]=')' ; a8=4;
kuo(3,3,2,4){
a1[4]=')' ; a8=5
kuo(3,3,3,5){
a[1]=a1[0]=(; ( ( ) ) ); f=1;
}
a8=count=4=3=2=1;
lk=2,rk=0;
a1[1]=‘)' a8=2;
kuo(3,2,1,2){
a1[2]=( ; a8=3;
kuo(3,3,1,3){
a1[3]=) ;a8=4;
kuo(3,3,2,4){
a1[4]=) ;a8=5;
kuo(3,3,3,5){ (()()) }
}
}
a1[2]=) ; a8=3;
kuo(3,2,2,3){
a1[3]=(;a8=4;
kuo(3,3,2,4){
a1[4]=) ; a8=5;
kuo(3,3,3,5){ (())() }
}
}
}
}
}
}
}
}
#include <stdio.h>
#include<stdio.h>
char a[1000];
char a1[10000];
int pos=0;
int f=1;
void dfs(int ss,int lk,int rk,int count){
if(lk >= ss && rk >= ss){
int ii;
for(ii=0 ; ii < pos ;ii++){
a[f++]=a1[ii];
}
puts(a);
printf("\n");
f=1;
return;
}
if(lk < ss){
a1[pos++]='(';
dfs(ss,lk+1,rk,count+1);
pos=count;
}
if(rk < lk){
a1[pos++]=')';
dfs(ss,lk,rk+1,count+1);
pos=count;
}
}
void main(){
a[0]='(';
int ss=3;
int count=0;
int lk=1;
int rk=0;
dfs(ss,lk,rk,count);
}