【LeetCode】升级打怪之路 Day 28:回溯算法 — 括号生成 删除无效的括号

今日题目:

  • 22. 括号生成
  • 301. 删除无效的括号

参考文章:

  • 回溯算法:括号生成
  • 回溯算法:删除无效的括号

这是两道使用回溯算法来解决与括号相关的问题,具备一定的难度,需要学习理解。

  • 通过第一道题“括号生成”,我们可以更加深入地理解在回溯算法的递归中 backtrack() 调用前后的“做选择”与“撤销选择”之间的关系。我们要秉承的原则是:“撤销选择”中的动作必须与“做选择”时的动作呈现镜像效果。具体可以在这个题目讲解中展现。
  • 第二道题,TODO

LC 22. 括号生成 【稍有难度】 ⭐⭐⭐

22. 括号生成 | LeetCode

在使用回溯算法解决时,可以很自然地想到,递归时的路径 path 就是当前放入的所有括号字符,这样回溯完可以得到所有可能的括号排列序列,但为了验证得到的括号序列是否满足“括号匹配”的要求,我们需要引入一个 stack 来做当前的括号序列能否匹配进行检查。

使用 stack 来检查括号匹配是因为,我们之前在做括号匹配检测时就是使用的 stack。stack 的特性很适合做这件事情。

在括号匹配问题中,我们都会引入一个 stack 来辅助检测,这个 stack 只保存左括号,每次出现一个右括号,就要在 stack 中 pop 出一个相应的左括号并一同扔掉。这是做括号匹配的经典思路,也是这里需要维护 stack 的操作。

这里引入 stack 来做检查后,stack 与 path 一同随着每次递归调用来传递,这样“做选择”和“撤销选择”这两个过程中都需要维护好 stack 和 path 两个数据结构。path 的维护还好说,做选择时就是将括号加入 path 尾部,撤销选择就是删除 path 的尾部元素,这里一个难点就是 stack 的维护。因为当我们在做选择时:

  • 如果加入的是右括号,那就需要在 stack 中 pop 掉与之匹配的左括号
  • 如果加入的是左括号,那直接加入到 stack 尾部就好了

在撤销选择时,为了与之形成镜像,我们就需要:

  • 如果之前在 path 加入的是右括号,那就需要在 stack 尾部追加一个左括号,来弥补之前在做选择时删除掉的左括号
  • 如果之前在 path 加入的是右括号,那就只需要删除 stack 尾部的元素即可。

这里的关键就是,在想清楚“做选择”时怎么做之后,要让“撤销选择”的过程形成与之镜像的过程。也就是这里的,如果之前删除了元素,那之后就要追加一个元素作为补偿。

代码示例如下:

在这里插入图片描述

可以看到,backtrack() 前后的操作过程正好形成镜像

这里还有一个易错点(我就出错了),做选择时,path 的更新要在 stack 的更新之后,因为通过 stack 检测到括号匹配不符号要求后会剪枝回退,而这时如果更新了 path 的话就会导致 path 没有类似“撤销选择”时的补偿维护,从而导致错误。

这个题目建议自己动手再做一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/496645.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vivado使用(2)——综合运行与OOC

目录 一、综合运行 二、OOC 2.1 如何设置 OOC 模块 2.2 存根文件和黑盒属性 2.3 使用限制 2.4 另一种设置方法 一、综合运行 一个“运行(run)”是指定义和配置设计在综合过程中的各方面,包括:使用到约束,针对的…

Java常见限流用法介绍和实现

目录 一、现象 二、工具 ​​​​​​1、AtomicInteger,AtomicLong 原子类操作 ​​​​​​2、RedisLua ​​​​​​3、Google Guava的RateLimiter 1) 使用 2) Demo 3) 优化demo 4、阿里开源的Sentinel 三、算法 1、计数限流 &…

Java实现猜数字游戏:编程入门之旅

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

HDFS的Shell操作及客户端配置方法

HDFS进程启停命令 Hadoop HDFS组件内置了HDFS集群的一键启停脚本。 $HADOOP_HOME/sbin/start-dfs.sh,一键启动HDFS集群$HADOOP_HOME/sbin/stop-dfs.sh,一键关闭HDFS集群 执行原理: 在执行此脚本的机器上,启动(关闭&…

二叉树|538.把二叉搜索树换为累加树

力扣题目链接 class Solution { private:int pre 0; // 记录前一个节点的数值void traversal(TreeNode* cur) { // 右中左遍历if (cur NULL) return;traversal(cur->right);cur->val pre;pre cur->val;traversal(cur->left);} public:TreeNode* convertBST(Tre…

阎淑萍:老母猪戴口罩还挺重视这张老脸啊,赵本山:我也相当副科级呀!

阎淑萍:老母猪戴口罩还挺重视这张老脸啊,赵本山:我也相当副科级呀! ——小品《老拜年》(上)的台词 《老拜年》 是赵本山、阎淑萍、王中青、苏杰在《1993年中央电视台春节联欢晚会》上表演的小品&#xff0…

web全栈架构师第16期教程

教程介绍 互联网时代已进入后半场,行业环境发生了显著变化。互联网人,尤其是技术人员,如何在加速更迭的技术浪潮中持续充电,提升自身价值,是当下必须面对的挑战。课程涉及了现下前端实际开发时所需要的各块内容&#…

发现数据异常波动怎么办?别慌,指标监控和归因分析来帮你

企业搭建完善、全面的指标体系是企业用数据指导业务经营决策的第一步。但是做完指标之后,对指标的监控,经常被大家忽视。当指标发生了异常波动(上升或下降),需要企业能够及时发现,并快速找到背后真实的原因…

Xcode删除原本的Git,再添加新的git

本文参考:Xcode怎么删除原本git,在重新设置新的git地址_ios xcode 删除原本git-CSDN博客 开发中会有一个问题。Xcode项目A 提交到Git服务器server1,此时项目A内部已经存在一个Git文件,与server1相关联。 此时你想将项目A提交到 另一个Git…

算法打卡day30|贪心算法篇04|Leetcode 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

算法题 Leetcode 860.柠檬水找零 题目链接:860.柠檬水找零 大佬视频讲解:柠檬水找零视频讲解 个人思路 5元最通用,然后是10元,所以如果是对于20元找零直接先找10元,也涉及到贪心的思想,可以用贪心算法。 解法 贪心法…

加密流量分类torch实践5:TrafficClassificationPandemonium项目更新3

加密流量分类torch实践5:TrafficClassificationPandemonium项目更新3 更新日志 代码已经推送开源至露露云的github,如果能帮助你,就给鼠鼠点一个star吧!!! 我的CSDN博客 我的Github Page博客 3/23日更新…

打造核心竞争力:高效Web系统数据中台的设计与实践_光点科技

在数字化的浪潮中,数据已经成为企业赖以生存和发展的核心资源。一个高效的Web系统数据中台,能够赋予企业在激烈的市场竞争中立于不败之地的能力。本文将深入探讨如何设计和实施一个能够提升企业数据管理水平和支持业务决策的高效数据中台架构。 数据中台…

基于Python实现多功能翻译助手(下)

为了将上述步骤中的功能增强与扩展具体化为代码,我们将实现翻译历史记录功能、翻译选项配置以及UI的改进。 翻译历史记录功能 import json # 假设有一个用于存储历史记录的json文件 HISTORY_FILE translation_history.json # 初始化历史记录列表 translati…

数组---

1、数组的定义 Java中,数组存储固定大小的同类型元素。 数组是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一的管理。 数组的特点: 数组本身是引用数据类型,但数组中的…

Spring使用(一)注解

Spring使用 资源 Spring 框架内部使用 Resource 接口作为所有资源的抽象和访问接口,在上一篇文章的示例代码中的配置文件是通过ClassPathResource 进行封装的,ClassPathResource 是 Resource 的一个特定类型的实现,代表的是位于 classpath …

vue3+Pinia的使用 - 封装

目录: persist.ts 可存储到本地 import { PersistedStateOptions } from "pinia-plugin-persistedstate";/*** description pinia 持久化参数配置* param {String} key 存储到持久化的 name* param {Array} paths 需要持久化的 state name* return per…

基于Transformer的医学图像分类研究

医学图像分类目前面临的挑战 医学图像分类需要研究人员同时具备医学图像分析和数字图像的知识背景。由于图像尺度、数据格式和数据类别分布的影响,现有的模型方法,如传统的机器学习的识别方法和基于深度卷积神经网络的方法,取得的识别准确度…

2024第六届环境科学与可再生能源国际会议能源 (ESRE 2024) 即将召开!

2024第六届环境科学与可再生能源国际会议 能源 (ESRE 2024) 即将举行 2024 年 6 月 28 日至 30 日在德国法兰克福举行。ESRE 2024 年 旨在为研究人员、从业人员和专业人士提供一个论坛 从工业界、学术界和政府到研究和 发展,环境科学领域的专…

Kubernetes 知识体系 系列一

多年前,大多数软件应用程序都是大型的单体,要么作为单个进程运行,要么作为少数服务器上的少量进程运行。这种过时的系统一直延续很久。 它们的发布周期较慢,更新相对较少。 在每个发布周期结束时,开发人员将整个系统…

算法第三十四天-有效数独

有效数独 题目要求 解题思路 一个简单的方法是,遍历9*9书读三次,以确保: 行中没有重复的数字列中没有重复的数字3*3子数独中没有重复的数字 但是,实际上,所有的一切都以可以在一次迭代中完成 可以使用box_index (r…
最新文章