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

力扣热题100_回溯_22_括号生成

文章目录

  • 题目链接
  • 解题思路
  • 解题代码


题目链接

22. 括号生成

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

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

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

解题思路

下面我们根据回溯算法三步走,写出对应的回溯算法。

明确所有选择:括号组合中的每个位置,都可以从 ( 或者 ) 中选出。并且,只有在 symbol < n 的时候,才能选择 (,在 symbol > 0 的时候,才能选择 )。
明确终止条件:当遍历到决策树的叶子节点时,就终止了。即当前路径搜索到末尾时,递归终止。
将决策树和终止条件翻译成代码:

  • 定义回溯函数:
    • backtracking(symbol, index): 函数的传入参数是 symbol(用于表示是否当前组合是否成对匹配),index(当前元素下标),全局变量是 parentheses(用于保存所有有效的括号组合),parenthesis(当前括号组合)。
    • backtracking(symbol, index) 函数代表的含义是:递归根据 symbol,在 ( 和 ) 中选择第 index 个元素。
  • 书写回溯函数主体(给出选择元素、递归搜索、撤销选择部分)。
    • 从当前正在考虑元素,到第 2 * n 个元素为止,枚举出所有可选的元素。对于每一个可选元素:
      • 约束条件:symbol < n 或者 symbol > 0。
      • 选择元素:将其添加到当前括号组合 parenthesis 中。
      • 递归搜索:在选择该元素的情况下,继续递归选择剩下元素。
      • 撤销选择:将该元素从当前括号组合 parenthesis 中移除。
if symbol < n:parenthesis.append('(')backtrack(symbol + 1, index + 1)parenthesis.pop()
if symbol > 0:parenthesis.append(')')backtrack(symbol - 1, index + 1)parenthesis.pop()
  • 明确递归终止条件(给出递归终止条件,以及递归终止时的处理方法)。
    • 当遍历到决策树的叶子节点时,就终止了。也就是当 index == 2 * n 时,递归停止。
    • 并且在 symbol == 0 时,当前组合才是有效的,此时将其加入到最终答案数组中。

解题代码

class Solution:def generateParenthesis(self, n: int) -> List[str]:parentheses = []parenthesis = []def backtrack(symbol, index):if n * 2 == index:if symbol == 0:parentheses.append("".join(parenthesis))else:if symbol < n:parenthesis.append('(')backtrack(symbol + 1, index + 1)parenthesis.pop()if symbol > 0:parenthesis.append(')')backtrack(symbol - 1, index + 1)parenthesis.pop()backtrack(0, 0)return parentheses

参考资料:datawhalechina

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • openstack基本操作
  • windows平台的postgresql主从数据库流备份
  • UNiapp之微信小程序导出Excel
  • PCIe学习笔记(25)
  • OpenHarmony基础组件—图片加载ImageKnife
  • 登录 k8s-Dashboard 显示 Your connection is not private
  • 多线程并行
  • 水库大坝安全预警系统的创新与应用
  • 职场那些事:应对施暴者的智慧
  • 代码随想录训练营 Day36打卡 动态规划 part04 1049. 最后一块石头的重量II 494. 目标和 474. 一和零
  • 流动会场:声音与空间完美融合,重新定义城市多功能场所—轻空间
  • 虚拟化平台kvm架构 部署kvm虚拟化平台
  • OpenCV几何图像变换(3)计算透视变换矩阵函数getPerspectiveTransform()的使用
  • Nginx源码安装与进阶负载均衡
  • SSH 隧道方式连接 MySQL 服务器
  • [case10]使用RSQL实现端到端的动态查询
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • C++类的相互关联
  • exif信息对照
  • log4j2输出到kafka
  • Making An Indicator With Pure CSS
  • Vue2 SSR 的优化之旅
  • Xmanager 远程桌面 CentOS 7
  • 包装类对象
  • 浮动相关
  • 给Prometheus造假数据的方法
  • 给新手的新浪微博 SDK 集成教程【一】
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 数据仓库的几种建模方法
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​你们这样子,耽误我的工作进度怎么办?
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #每日一题合集#牛客JZ23-JZ33
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (LeetCode C++)盛最多水的容器
  • (pojstep1.3.1)1017(构造法模拟)
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (四)软件性能测试
  • (原)Matlab的svmtrain和svmclassify
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .NET Core 成都线下面基会拉开序幕
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET序列化 serializable,反序列化
  • @GetMapping和@RequestMapping的区别
  • @property python知乎_Python3基础之:property
  • @软考考生,这份软考高分攻略你须知道
  • [16/N]论得趣
  • [20160902]rm -rf的惨案.txt
  • [AI Google] 使用 Gemini 取得更多成就:试用 1.5 Pro 和更多智能功能
  • [Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解