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

leetcode22:括号问题

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 8

问题分析

题目性质

该问题属于组合生成问题,输入是一个数字 nn,代表括号对数,输出是一个包含所有可能且有效的括号组合的列表。有效的括号组合要求:

  1. 每个组合中左括号和右括号数量相等。
  2. 任意前缀的右括号数量不能超过左括号数量。
输入条件
  • nn:整数,表示括号对数。
  • 1≤n≤81 \leq n \leq 8
输出条件
  • 一个字符串列表,包含所有有效的括号组合。
边界条件
  • n=1n = 1:只有一个组合 ["()"]
  • nn 较大时,输出的组合数量呈指数级增长。

解题步骤

步骤1:算法设计

此问题可以用回溯法解决。通过递归地尝试添加左括号和右括号,同时确保每一步生成的部分字符串都满足有效性条件。

回溯法逻辑:

  1. 使用两个计数器:left 表示已使用的左括号数量,right 表示已使用的右括号数量。
  2. 初始条件:left = 0, right = 0, 初始字符串为空。
  3. 在每一步递归中:
    • 如果 left < n,可以添加左括号。
    • 如果 right < left,可以添加右括号。
    • left == nright == n 时,生成一个完整的有效括号组合。
  4. 递归终止条件:leftright 都达到 nn。
步骤2:时间和空间复杂度
  • 时间复杂度:生成 C2nn/(n+1)C_{2n}^n / (n+1) 个有效组合,递归深度为 2n2n,时间复杂度为 O(4n/n)O(4^n / \sqrt{n})。
  • 空间复杂度:递归栈的深度为 2n2n,每次递归会保存部分路径,空间复杂度为 O(n)O(n)。
步骤3:代码实现

以下是实现代码,使用 C++ 并附带详细中文注释。

// 回溯函数
void backtrack(vector<string>& result, string current, int left, int right, int n) {
    // 如果当前组合已经完成
    if (left == n && right == n) {
        result.push_back(current);
        return;
    }
    // 如果可以添加左括号,尝试添加
    if (left < n) {
        backtrack(result, current + "(", left + 1, right, n);
    }
    // 如果可以添加右括号,尝试添加
    if (right < left) {
        backtrack(result, current + ")", left, right + 1, n);
    }
}

// 主函数
vector<string> generateParenthesis(int n) {
    vector<string> result;
    backtrack(result, "", 0, 0, n);
    return result;
}



解决问题的启发

  1. 递归+回溯是解决生成类问题的经典方法:
    • 回溯法在生成所有可能性时,动态裁剪不满足条件的分支,提升了效率。
  2. 问题建模的重要性:括号组合可以抽象为“左右平衡”的动态构造问题,利用递归函数中的参数控制状态。

实际生活中的应用

场景:任务调度

在任务调度场景中,括号生成问题可以用于解决任务依赖问题。例如:

  • (( 对应“开始任务”和“完成任务”。
  • 合法的括号组合对应有效的任务执行顺序。
具体示例:

假设有 n=3个任务,每个任务需要“启动”和“结束”,且不能在启动前结束任务。通过上述算法,可以生成所有合法的任务执行顺序。

实现方法:

  1. 使用括号生成算法生成所有合法任务序列。
  2. 将任务映射到括号组合中:
    • ( 映射为“启动任务”。
    • ) 映射为“结束任务”。
  3. 在任务依赖场景下验证这些序列。

通过这样的模型化方法,可以在分布式系统、自动化任务执行中应用。


http://www.kler.cn/a/451875.html

相关文章:

  • Text组件的用法
  • Y3编辑器教程8:资源管理器与存档、防作弊设置
  • 《Swift 字面量》
  • 快速解决oracle 11g中exp无法导出空表的问题
  • 预览和下载 (pc和微信小程序)
  • EasyExcel停更,FastExcel接力
  • 《探寻神经网络RNN:从原理到应用的奇幻之旅》
  • 基于Java的在线教育系统
  • 《Swift 字面量》
  • 【web网页制作】html+css旅游家乡河南开封主题网页制作(4页面)【附源码】
  • DENIAL-OF-SERVICE POISONING ATTACKS ON LARGE LANGUAGE MODELS
  • 5-Gin 静态文件服务 --[Gin 框架入门精讲与实战案例]
  • KAFKA 权威指南笔记(一)究竟应该配置多少个BROKER?
  • 【每日学点鸿蒙知识】上架流程、h5返回收拾拦截、两个枚举类型之间转换、hvigorw命令、绘制本地图片
  • 代码随想录算法训练营第一天 | 704. 二分查找、 27. 移除元素、977.有序数组的平方
  • Python知识图谱框架
  • 22【AUTOSAR自适应平台设计的概述01】杂项概念介绍
  • Hive其十,优化和数据倾斜
  • 要查询 `user` 表中 `we_chat_open_id` 列不为空的用户数量
  • 多边形内角问题@三角形的基本性质@平面镶嵌问题
  • CASA(Carnegie-Ames-Stanford Approach) 模型原理及实践技术
  • Python PDF批量加密工具
  • 妙用编辑器:如何使用编辑器的筛选功能更高效的阅读日志
  • 在 macOS 和 Windows 平台上使用 SVN 的完整指南20241225
  • Golang的性能监控指标
  • Milvus矢量数据库 麒麟v10安装