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

题目详情

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

示例 1:

输入:n = 3

输出:"((()))","(()())","(())()","()(())","()()()"

示例 2:

输入:n = 1

输出:"()"

提示:

  • 1 <= n <= 8

解题思路

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

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

代码实现(Java版)

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 减少字符串操作开销。

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

相关推荐
奋发向前wcx5 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
Miao121316 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
CRMEB系统商城7 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience8 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu
战族狼魂9 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
weixin_408099679 小时前
2026 图片去水印 API 接口完全指南:一键去除图片水印(附 Python/Java/PHP/C# 示例)
java·python·php·图片处理·api调用·图片去水印·石榴智能
李剑一9 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH9 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
钱六两9 小时前
#3、SpringAI 接入deepSeek大模型(喂饭版)
java·spring boot·ai编程
中达瑞和-高光谱·多光谱9 小时前
1nm到8nm光谱分辨率,你的应用该选哪款光谱相机?
算法·高光谱·高光谱相机