HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
  • 《LearnJavaToFindAJob》

    • 导读

    • 【初级】6~12k档

    • 【中级】12k-26k档

      • JVM进阶

      • Java进阶

      • MySQL

      • 中间件

      • 算法

        • 1-两数之和
        • 高频算法面试题
        • 2两数相加
        • 09-用两个栈实现一个队列
        • 11-盛水最多的容器
        • 19-删除链表的倒数第N个结点
        • 20-有效的括号
        • 22-括号生成
        • 39-组合总和
        • 46-全排列
        • 53-连续最大子序和
        • 64匹马,只有8个赛道,挑选出最快的4匹马
        • 70-爬楼梯
        • 136-只出现一次的数字
        • 141环形链表
        • 206-翻转链表
        • 234回文链表
        • 387-字符串中的第一个唯一字符
        • 543二叉树最大直径
        • 八大排序算法
        • 剪绳子
        • 旋转数
        • 模板
        • 求解立方根不使用库函数
      • 高阶

    • 【高级】26k+档

    • 大厂面试题

    • 求职建议

    • 面经

  • LearnJavaToFindAJob
  • 【中级】12k-26k档
  • 算法
#括号生成
码农阿雨
2022-06-02
目录

22-括号生成

# 描述

难度:中等

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

示例 1:

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

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

提示:

1 <= n <= 8

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/generate-parentheses 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

# 思路

# 方法一:回溯法

和全排列一样的思想,先一步一步把末端的数填满,然后再返回上一层,继续填。

在这里也是一样的思路,在这个List里面,只要它是有效的,就继续往List里面添加 ( or )

再来看一个规则:

假如 n=3,那么( 只能有3个,)也只能有3个,失衡了就不是有效括号了。

再想一下,如果左括号( 数量小于 n ,那么我们就可以把它放进list里面;如果右括号 )小于左括号( 数量,那我们可以放一个右括号,这样才能组成有效括号。

# 题解

这个回溯挺有意思的,可以debug一步一步来看看。

public class 括号生成22 {
    public static void main(String[] args) {
        /*
        放括号成为有效括号的原则:
        如果 左括号 ( 数量 小于 n ,那么需要放一个,且优先级要比下面这个判断要高
        如果 右括号 ) 数量 小于 左括号) 数量,那么需要放一个
        */
        System.out.println(generateParenthesis(3));
    }

    static List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        backtrack(n, 0, 0, res, new StringBuilder());
        return res;
    }
	//空间复杂度:O(n)
    static void backtrack(int n, int open, int close, List<String> res, StringBuilder track) {
        if (track.length() == n * 2) {
            res.add(track.toString());
            return;
        }
        if (open < n) {
            track.append("(");
            backtrack(n, open + 1, close, res, track);
            track.deleteCharAt(track.length() - 1);
        }
        if (close < open) {
            track.append(")");
            backtrack(n, open, close + 1, res, track);
            track.deleteCharAt(track.length() - 1);
        }
    }
}
阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#括号生成
上次更新: 2026-03-28 17:00:16
最近更新
01
MySQL支持的锁有哪些
03-28
02
HTTP 是不保存状态的协议, 如何保存用户状态
03-28
03
用户态和内核态的区别
03-28
更多文章>
Theme by Vdoing | Copyright © 2020-2026 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式