LeetCode经典易错记录-22. 括号生成

22. 括号生成
该算法题使用回溯来进行求解为最优,回溯重点为进如递归函数前改一下状态,出来后进行状态还原。复杂回溯可以结合备忘录模式来求解更为复杂的场景。回溯思考过程一般结合树来进行思考。以下是该题的思考过程。

思路一:错误思路
首先我想到的一个非回溯思路1如下:

// 创建一个空的list,用于存储所有满足条件的括号组合
        Set<String> sets = new HashSet();
        if (n <= 0)
            return new ArrayList(sets);
        sets.add("()");
        for(int i = 1; i < n; i++){
            String[] strs = sets.toArray(new String[sets.size()]);
            sets.clear();
            // 对于每一个上一次括号组合,根据在每一个元素左边、右边、左右进行添加
            for (String str:strs){
                sets.add("()" + str);
                sets.add(str + "()");
                sets.add("(" + str + ")");
            }
        }
        return new ArrayList(sets);

以上算法逻辑,1、把"()“加入一个集合sets中。2、复制该集合,并进行遍历,再每一个元素的前面加上”()“,后面加上”()“,元素前加”(“后加”)“。加入sets中进行去重。
该思路有一个明显的错误,会造成缺少某些组合,比如”(())(())"。因为以上策略,无法产生某些对称的组合。

思路二:非最优思路
思路二采用回溯来进行求解,回溯算法擅长于给定一个状态变量,每一次都来对该状态进行改变。

// 方法一:利用左右括号差集来减少回溯 回溯方法求解 n代表单个括号的数量、str代表回溯的位置字符串、diff代表左括号个数 - 右括号个数
public void generateParenthesisByBackTracking(int n, StringBuilder str, int diff){  
        if(str.length() == n ){
            if(diff != 0)  // 当两个括号相等时,才会加入lists集合
                return;
            lists.add(new String(str.toString()));
            return;
        }

        if (diff < n / 2){  // 添加左括号的条件
            str.append("("); 
            generateParenthesisByBackTracking(n, str, diff + 1);
            str.deleteCharAt(str.length() - 1);
        }
        
        if(diff > 0){
            str.append(")");
            generateParenthesisByBackTracking(n, str, diff - 1);
            str.deleteCharAt(str.length() - 1);
        }
    }

以上思路是没有问题的,但是并非最优,因为在str.length() == n出口判断中,要判断左右括号是否相等,就说明存在部分枝干没有减掉(减枝),导致无效的递归。主要是在diff < n / 2判断处,因为diff代表左右括号数量的差,diff < n / 2减枝不彻底。因此,改进该算法,如下思路三。

加粗样式
该思路不使用diff而是换成left和right来实现。

   // 方法二:方法一中,在加入集合前依然要判断左右括号是否相等,说明在回溯过程中减枝不彻底,所以引入方法二 left right机制
     public void generateParenthesisByBackTracking(int n, StringBuilder str, int left, int right){  
        if(str.length() == n){
            lists.add(new String(str.toString()));
            return;
        }

        // 是否加入左括号
        if(left < n / 2){
            str.append("("); 
            generateParenthesisByBackTracking(n, str, left + 1, right);
            str.deleteCharAt(str.length() - 1);
        }

        // 是否加入右括号
        if(left > right){
             str.append(")"); 
            generateParenthesisByBackTracking(n, str, left, right + 1);
            str.deleteCharAt(str.length() - 1);
        }
    }

此处,在判断left < n / 2时,并非差,而是左括号,因此,将不正确的枝干减掉,没有一次是多余的递归。

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

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

相关文章

RibbitMQ-安装

本文主要介绍RibbitMQ的安装 RabbitMQ依赖于Erlang&#xff0c;因此首先需要安装Erlang环境。分别下载erlang-26.2.5-1.el7.x86_64.rpm、rabbitmq-server-4.0.3-1.el8.noarch.rpm 官网地址&#xff1a;https://www.rabbitmq.com/ 官网文档&#xff1a;https://www.rabbitmq.c…

【Linux】解锁操作系统潜能,高效线程管理的实战技巧

目录 1. 线程的概念2. 线程的理解3. 地址空间和页表4. 线程的控制4.1. POSIX线程库4.2 线程创建 — pthread_create4.3. 获取线程ID — pthread_self4.4. 线程终止4.5. 线程等待 — pthread_join4.6. 线程分离 — pthread_detach 5. 线程的特点5.1. 优点5.2. 缺点5.3. 线程异常…

WPF+MVVM案例实战(二十二)- 制作一个侧边弹窗栏(CD类)

文章目录 1、案例效果1、侧边栏分类2、CD类侧边弹窗实现1、样式代码实现2、功能代码实现3 运行效果4、源代码获取1、案例效果 1、侧边栏分类 A类 :左侧弹出侧边栏B类 :右侧弹出侧边栏C类 :顶部弹出侧边栏D类 :底部弹出侧边栏2、CD类侧边弹窗实现 1、样式代码实现 在原有的…

如何对LabVIEW软件进行性能评估?

对LabVIEW软件进行性能评估&#xff0c;可以从以下几个方面着手&#xff0c;通过定量与定性分析&#xff0c;全面了解软件在实际应用中的表现。这些评估方法适用于确保LabVIEW程序的运行效率、稳定性和可维护性。 一、响应时间和执行效率 时间戳测量&#xff1a;使用LabVIEW的时…

stm32使用串口DMA实现数据的收发

前言 DMA的作用就是帮助CPU来传输数据&#xff0c;从而使CPU去完成更重要的任务&#xff0c;不浪费CPU的时间。 一、配置stm32cubeMX 这两个全添加上。参数配置一般默认即可 代码部分 只需要把上期文章里的HAL_UART_Transmit_IT(&huart2,DATE,2); 全都改为HAL_UART_Tra…

论文1—《基于卷积神经网络的手术机器人控制系统设计》文献阅读分析报告

论文报告&#xff1a;基于卷积神经网络的手术机器人控制系统设计 摘要 本研究针对传统手术机器人控制系统精准度不足的问题&#xff0c;提出了一种基于卷积神经网络的手术机器人控制系统设计。研究设计了控制系统的总体结构&#xff0c;并选用PCI插槽上直接内插CAN适配卡作为上…

「C/C++」C/C++ 之 变量作用域详解

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

JSP ft06 问题几个求解思路整理

刷到这篇文章使用Q-learning去求接JSP ft06 问题用基本Q-learning解决作业车间调度问题(JSP)&#xff0c;以FT06案例为例_q-learning算法在车间调度-CSDN博客 本着贼不走空的原则打算全部copy到本地试下&#xff0c;文章作者使用的tf06.txt在这里获取 https://web.cecs.pdx.e…

Uniapp安装Pinia并持久化(Vue3)

安装pinia 在uni-app的Vue3版本中&#xff0c;Pinia已被内置&#xff0c;无需额外安装即可直接使用&#xff08;Vue2版本则内置了Vuex&#xff09;。 HBuilder X项目&#xff1a;直接使用&#xff0c;无需安装。CLI项目&#xff1a;需手动安装&#xff0c;执行yarn add pinia…

Template Method(模板方法)

1)意图 定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2)结构 模板方法模式的结构图如图7-47 所示。 其中: AbstractClass(抽象类) 定义抽象的原语操作&#xff0c;具体…

无人机场景数据集大全「包含数据标注+划分脚本+训练脚本」 (持续原地更新)

一、作者介绍&#xff1a;六年算法开发经验、AI 算法经理、阿里云专家博主。擅长&#xff1a;检测、分割、理解、AIGC 等算法训练与推理部署任务。 二、数据集介绍&#xff1a; 质量高&#xff1a;高质量图片、高质量标注数据&#xff0c;使用 labelimg 软件吐血标注、整理&…

安当ASP系统:适合中小企业的轻量级Radius认证服务器

安当ASP&#xff08;Authentication Service Platform&#xff09;身份认证系统是一款功能强大的身份认证服务平台&#xff0c;特别适用于中小企业。其中&#xff0c;简约型Radius认证服务器是安当ASP系统中的一个重要组成部分。以下是对该系统的详细介绍&#xff1a; 一、主要…

跨域及解决跨域

什么是跨域 前端与后端不在同一个域名下&#xff1a; 解决 import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component;import java.io.IOException…

关于解决DICOM文件中中文乱码问题的解决方案

目录 问题背景 常见字符集和编码 DICOM标准中的字符集支持 解决方案 示例代码 处理不同字符集的示例 关键点 注意事项 结论 在解析DICOM文件时,如果字符集处理不当,可能会出现中文乱码的问题。本文将介绍如何正确处理DICOM文件中的字符集,以避免乱码问题。DICOM文件…

6.机器学习--PCA主成分分析(降维)

目录 1.问题的引入 为什么要降维&#xff1f; 降维的好处 降维的本质 2.降维的主要方法&#xff1a; 2.1 特征选择 2.2 特征抽取 3.主成分分析&#xff08;PCA&#xff09;推导 3.1.向量的表示及基变换 3.2.协方差矩阵及优化目标 3.3.算法及实例 3.4.实例 3.5.代…

我们来学mysql -- 同时使用 AND 和 OR 查询错误(填坑篇)

AND 和 OR 一同使用问题 现象分析处理扩展 现象 业务上在“锁定”当前零件所在出口国的所有零件时&#xff0c;出现其他国家零件 问题定位 分析 or 切断了操作符之间的连续性&#xff0c;从union角度分析 where k1 Td621 and k1 Vda96 or k3 P00009等同 select * fr…

基于Zynq FPGA的雷龙SD NAND存储芯片性能测试

文章目录 前言一、SD NAND特征1.1 SD卡简介1.2 SD卡Block图 二、SD卡样片三、Zynq测试平台搭建3.1 测试流程3.2 SOC搭建 四、软件搭建五、测试结果六、总结 前言 随着嵌入式系统和物联网设备的快速发展&#xff0c;高效可靠的存储解决方案变得越来越重要。雷龙发展推出的SD NA…

vscode翻译插件

vscode翻译插件 需求 &#xff1a; 在编写代码的时候&#xff0c; 打印或者定义变量的时候总是想不起来英文名称&#xff0c; 所有就开发了一款中文转换为英文的插件。 功能 1、目前支持选中中文&#xff0c;右键选择打印或者变量进行转换。 2、目前支持选中中文&#xff0…

信息安全工程师(81)网络安全测评质量管理与标准

一、网络安全测评质量管理 遵循标准和流程 网络安全测评应严格遵循国家相关标准和流程&#xff0c;确保测评工作的规范性和一致性。这些标准和流程通常包括测评方法、测评步骤、测评指标等&#xff0c;为测评工作提供明确的指导和依据。 选择合格的测评团队 测评团队应具备相关…

【C++】lambda表达式的理解与运用(C++11新特性)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 目录 前言 C11之前的例子 一、lambda的语法 lambda函数示例&#xff1a; 二、lambda的捕获列表 1.传值捕获 mutable修饰 2.…