22. 括号生成

本文详细介绍了如何使用回溯法解决括号的有效生成问题,重点在于理解左括号和右括号的平衡条件,并给出了Java代码实现。示例展示了不同括号对数下的生成结果,对于算法初学者和面试准备具有参考价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

22. 括号生成

难度中等1552

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

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= n <= 8

通过次数225,350提交次数293,515

思路是:采用类二叉树回溯法(lc39,40,78等),选括号或者不选括号,首先符合条件一定是左括号在头位置。

括号匹配的特殊点是:添加某括号时,左括号的数量要大于等于右括号的数量

我们可以用一个数来表示当前添加右括号的数量,一个表示左括号的数量,以此条件做二叉树剪枝即可!

 

解答成功:
            执行耗时:1 ms,击败了96.21% 的Java用户
            内存消耗:38.7 MB,击败了43.04% 的Java用户


class Solution {
    List<String> res =new ArrayList<>();
    public void func(String s,int n,int nleft,int nright){
        if(nleft<nright) return;//右括号比左括号多
        if(nleft==nright&&nleft==n) {
            //左括号数量等于右括号数量,且达到n个
            res.add(s);
            return;
        }

        //添加左括号
        if(nleft<n){
            func(s+"(", n,nleft+1,nright);
        }
        //添加右括号
        func(s+")",n, nleft, nright+1);
    }

    public List<String> generateParenthesis(int n) {
        func("(",n,1,0);
        return res;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值