leetcode 22. 括号生成 回溯

数字 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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值