[菜鸟训练]22. 括号生成

题目描述:

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:
输入:n = 1
输出:["()"]

提示:
1 <= n <= 8

解题思路:

可以使用回溯解决该问题,再写程序的时候需要开两个计数器来记录当前串中左右括号的个数,并通过这个来进行回溯。

代码:

public class LC22 {
    //回溯。
    public List<String> generateParenthesis(int n) {
        List<String> ansList = new ArrayList<>();
        generate(ansList, "", 0, 0, n);
        return ansList;
    }
    //leftcnt代表目前字符串中左括号的个数,rightcnt代表目前字符串中右括号的个数
    //确保里面先添加的是"(",然后利用左右两个括号的个数,来进行递归
    private void generate(List<String> ansList, String s, int leftcnt, int rightcnt, int n) {
        //结束当前层递归的条件,注意当左右括号个数都超过n时,就不能在递归下去了
        //如果当前右括号的个数比左括号的个数多,那肯定时不匹配的,所以直接返回上层
        if (leftcnt > n || rightcnt > n || rightcnt > leftcnt){
            return;
        }

        //如果目前左右括号个数都是n,那一定是括号匹配的,我们将其加入List中
        if (leftcnt == n && n == rightcnt){
            ansList.add(s);
        }
        //当左括号的个数大于右括号的个数时,我们就可以往深层递归了,注意一定是先添加左括号再添加右括号
        //注意这里如果不加这个if判断的话,执行用时会多很多
        if (leftcnt >= rightcnt){
            generate(ansList, s + "(", leftcnt+1, rightcnt, n);
            generate(ansList, s + ")", leftcnt, rightcnt + 1, n);

        }
    }

    public static void main(String[] args) {
        LC22 obj = new LC22();
        List<String> list = obj.generateParenthesis(4);
        System.out.println(list);
    }
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值