当前位置: 首页 > news >正文

【中等】题解力扣22:括号生成

题目详情

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

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

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

提示:

  • 1 <= n <= 8

解题思路

使用回溯法(深度优先搜索) 生成所有有效括号组合,核心思路如下:

  1. 有效括号条件
  • 左括号数量不能超过 n
  • 右括号数量不能超过左括号(确保有效性)。
  1. 递归终止条件:当前字符串长度达到 2n 时,将结果加入列表。
  2. 递归过程
  • 若左括号数量 < n,添加左括号并递归。
  • 若右括号数量 < 左括号数量,添加右括号并递归。
  1. 回溯:每次递归后删除最后一个字符,尝试其他组合。
  2. 优化:使用 StringBuilder 避免字符串拼接开销,减少内存消耗。

代码实现(Java版)

import java.util.ArrayList;
import java.util.List;class Solution {public List<String> generateParenthesis(int n) {List<String> result = new ArrayList<>();backtrack(result, new StringBuilder(), 0, 0, n);return result;}private void backtrack(List<String> result, StringBuilder current, int left, int right, int n) {if (current.length() == 2 * n) {result.add(current.toString());return;}if (left < n) {current.append('(');backtrack(result, current, left + 1, right, n);current.deleteCharAt(current.length() - 1); // 回溯}if (right < left) {current.append(')');backtrack(result, current, left, right + 1, n);current.deleteCharAt(current.length() - 1); // 回溯}}
}

代码说明

  1. 初始化
  • result 存储最终结果,StringBuilder current 动态构建当前组合。
  1. 回溯函数
  • 参数left(已用左括号数)、right(已用右括号数)、n(总对数)。
  • 终止条件current.length() == 2 * n 时保存有效组合。
  • 左括号分支:当 left < n 时,添加 ( 并递归。
  • 右括号分支:当 right < left 时,添加 ) 并递归。
  • 回溯操作:递归返回后删除末尾字符,恢复状态尝试其他分支。
  1. 效率关键
  • 通过条件剪枝避免无效组合。
  • StringBuilder 减少字符串操作开销。

提交详情(执行用时、内存消耗)

在这里插入图片描述

http://www.dtcms.com/a/284557.html

相关文章:

  • 【专题十二】栈
  • 调用接口报错,使用postman调用就没问题如何解决
  • Redis 生产实战 7×24:容量规划、性能调优、故障演练与成本治理 40 条军规
  • Apollo10.0学习——control模块(2)之纵向控制器参数说明
  • Redisson布隆过滤器原理以及解决Redis缓存穿透方案
  • 单片机(STM32-时钟系统)
  • js是实现记住密码自动填充功能
  • PyCharm 高效入门指南:从安装到进阶,解锁 Python 开发全流程
  • EXCEL VBA合并当前工作簿的所有工作表sheet
  • 切比雪夫不等式的理解以及推导【超详细笔记】
  • C语言---动态内存管理
  • 李宏毅《生成式人工智能导论》 | 第15讲-第18讲:生成的策略-影像有关的生成式AI
  • Google(谷歌)搜索引擎蜘蛛IP地址段
  • ubuntu--curl
  • 《Java Web 核心:Servlet、会话与过滤器笔记》
  • AndroidStudio环境搭建
  • vue svg实现一个环形进度条组件
  • 石子入水波纹效果:顶点扰动着色器实现
  • 【44】MFC入门到精通——MFC 通过Button按钮添加控件变量实现:按下 按钮变色 (比如开关 打开关闭状态) MFC更改button控颜色
  • Git简介与特点:从Linux到分布式版本控制的革命
  • 找不到或无法加载主类 org.gradle.wrapper.GradleWrapperMain
  • Linux Swap区深度解析:为何禁用?何时需要?
  • 【Java EE初阶 --- 网络原理】网络编程
  • Vue3 + WebSocket
  • 基于现代R语言【Tidyverse、Tidymodel】的机器学习方法
  • 3.2 函数参数与返回值
  • .vscode 扩展配置
  • 浅析网络安全面临的主要威胁类型及对应防护措施
  • 【C++指南】C++ list容器完全解读(四):反向迭代器的巧妙实现
  • 如何做好DNA-SIP?