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

源代码:

class Solution {
public:int n;vector<string> ans;string path;vector<string> generateParenthesis(int n) {this->n = n;dfs(0, 0);return ans;}void dfs(int left, int right) {if (path.size() == 2 * n) {          // 递归出口:已凑够 2n 个字符ans.push_back(path);return;}if (left < n) {                      // 可以加 '('path.push_back('(');dfs(left + 1, right);path.pop_back();                 // 回溯}if (right < left) {                  // 可以加 ')'path.push_back(')');dfs(left, right + 1);path.pop_back();                 // 回溯}}
};

括号的两种关系:排列,嵌套;
讨论第一个括号:
排列:()…
嵌套:(…)
每种情况进行dfs递归;

path设置为string类型,排列的情况只需path = () + path;
嵌套的情况:path = ( + path + );SB
❌ 嵌套的情况应该是在剩余部分最外侧嵌套,这种写法会导致下次递归会在嵌套外侧修改。

设置前front,待定path,后back三段;
排列的情况:front = front+();
嵌套的情况:front = front+(; back = )+back;

这样只能做到在最前面排列单括号,整体嵌套,整体嵌套中最前面排列单括号,在嵌套中排列单括号;
无法再最后面排列单括号,无法在嵌套括号中排列单括号;

希望随时能直接加()或嵌套;
如果使用了嵌套,则需要在嵌套前,嵌套中,嵌套后的位置同理;
a.嵌套前:
排列:+(); 嵌套:在现在的位置后面+(,在最后+);
b.嵌套中:(前面是本次嵌套的(,后面是本次嵌套的));
排列:+(); 嵌套:在现在的位置后面+(,本次嵌套的)前面+);
c.嵌套后:(前面是上次嵌套的))
排列:+(); 嵌套:在现在的位置后面+(,在最后+);

过于复杂了,这个方法不好。
下面AI给出的实现也报错了:

class Solution {
public:vector<string> generateParenthesis(int n) {vector<string> ans;dfs("", "", n, n, ans);   // prefix, pending, left, rightreturn ans;}private:// 任何时刻真实串 = prefix + pending + 尚未展开的位置void dfs(string prefix, string pending,int left,           // 还能再放几个 '('int right,          // 还能再放几个 ')'vector<string>& ans){// 1. 终止条件:左右括号全都用完if (left == 0 && right == 0) {ans.push_back(prefix + pending);   // pending 此时为空return;}// 2. 在当前“可插入点”直接并列一对 ()//    等价于:prefix + pending + "()"//    注意 left、right 各减 1if (left >= 1 && right >= 1) {dfs(prefix + pending + "()", "", left - 1, right - 1, ans);}// 3. 新开一层嵌套:放一个 '(',并把对应的 ')' 压入 pendingif (left > 0) {dfs(prefix + pending + "(", ")" + pending, left - 1, right, ans);// 注意 pending 被整体右移,相当于把新 ')' 放在本次嵌套的末尾}// 4. 如果还有未匹配的左括号,就把 pending 第一个 ')' 真正落盘if (!pending.empty()) {dfs(prefix + pending[0], pending.substr(1), left, right, ans);// 这里 pending[0] 一定是 ')'}}
};

怎么回退?不回退的话每次递归调用都要定义两个新string。
在这里插入图片描述
我是真讨厌string。

string类型的数据常用索引处理,而不直接处理字符串本身。
或者直接将选择过的遍历作为参数传递给递归函数:
在这里插入图片描述
但是会返回完全一样的两组结果,即重复计算了一次。

n=1
排列: front=(); back=nullptr;
嵌套: front=(; back = );

用无序集去重,再转换成vector:
在这里插入图片描述
思路有问题。
无法构造 (())() ;
待定吧,今天懒得想了,再想怕失眠。
无法在最后加()的问题想不到解决的思路。

换思路:感谢灵神
https://leetcode.cn/problems/generate-parentheses/solutions/2071015/hui-su-bu-hui-xie-tao-lu-zai-ci-pythonja-wcdw/?envType=study-plan-v2&envId=top-interview-150

重要条件:当且仅当左括号数量大于右括号数量时,才能加右括号;
有了这个之后直接选与不选 子集法;

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ELK分布式日志采集系统

* 系统架构&#xff1a;filebeat 采集各服务器日志&#xff1b;Logstash-docker 过滤整理日志&#xff1b; Elasticsearch-docker 存储和索引数据&#xff1b; Kibana-docker 提供可视化展示和操作。* FileBeat简介&#xff1a;Filebeat是本地文件的日志数据采集器。* Kafka简介…

Python生产环境部署指南:专业级应用启动方案

在生产环境中部署Python应用需要考虑稳定性、性能和安全性。本文将详细介绍多种专业部署方案,助你构建可靠的生产环境。 一、核心部署架构 标准Python生产环境包含三个核心组件: 应用服务器:运行Python代码(Gunicorn/uWSGI/Uvicorn) 进程管理器:保障服务持续运行(Supe…

C语言:结构体、共用体与枚举详解

在 C 语言编程中&#xff0c;结构体&#xff08;struct&#xff09;、共用体&#xff08;union&#xff09;与枚举&#xff08;enum&#xff09;是三种非常重要的用户自定义数据类型。它们能帮助我们更好地组织、管理和表达复杂的数据结构。本文将结合实例&#xff0c;深入介绍…

Linux Web服务器与WordPress部署笔记

web服务器 nginx 配置基本认证 用户名和密码使用plain text发送&#xff0c;所以最好配置SSL/TLS。 # 安装工具[rootserver ~ 09:21:43]# yum -y install httpd-tools[rootserver ~ 09:28:30]# vim /etc/nginx/conf.d/ssl.confserver {​location /auth-basic/ {auth_basic …

贪心----3. 跳跃游戏 II

45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; /** 维护变量: max_reachable,遍历过的元素的最远可达位置 end,当前区间终点(随max_reachable变化) 遍历过程: 遍历时迭代遍历过的元素最远可达位置,利用end记录当前区间终点(随max_reachable变化) 当移动至end即当前…

RabbitMQ面试精讲 Day 13:HAProxy与负载均衡配置

【RabbitMQ面试精讲 Day 13】HAProxy与负载均衡配置 开篇 欢迎来到"RabbitMQ面试精讲"系列的第13天&#xff01;今天我们将聚焦RabbitMQ集群架构中的关键组件——HAProxy及其负载均衡配置。在大型分布式系统中&#xff0c;如何实现RabbitMQ集群的高可用和负载均衡是…

C# 中常用集合以及使用场景

1. 数组 (Array)‌‌特点‌&#xff1a;固定大小、内存连续、访问速度快‌使用场景‌&#xff1a;需要高性能的固定大小集合数值计算&#xff08;如矩阵运算&#xff09;存储已知长度的数据&#xff08;如配置文件参数&#xff09;‌2. List<T>‌‌特点‌&#xff1a;动态…

量化实战学习 Day 2:双均线策略实现与回测分析

一、前言在完成第一天的环境搭建和基础认知后&#xff0c;今天将进入真正的策略开发环节。本文将记录我从数据处理到第一个量化策略实现的全过程&#xff0c;包含完整的代码示例和深度思考。二、复习与环境检查1.1 环境复查首先确认了Day 1搭建的环境运行正常&#xff1a; cond…

ubuntu 安装内核模块驱动 DKMS 介绍

DKMS&#xff08;Dynamic Kernel Module Support&#xff0c;动态内核模块支持&#xff09;是一个用于管理 Linux 内核模块的工具&#xff0c;主要作用是在系统内核更新时&#xff0c;自动重新编译和安装依赖于特定内核版本的驱动程序&#xff08;内核模块&#xff09;&#xf…

adb使用指南

adb使用指南一、介绍二、连接一、有线连接方式二、无线连接方式**Android 10及以下版本****Android 11及以上版本**三、指令1、设备连接管理2、应用调试3、文件传输4、系统控制6、日志分析7、其他速查表总结python脚本实例&#xff1a;提示&#xff1a;以下是本篇文章正文内容&…

C语言实战:二级指针与文件操作的完美邂逅——动态管理文件数据

资料合集下载链接: ​https://pan.quark.cn/s/472bbdfcd014​ 在上一篇文章中,我们探讨了二级指针作为函数“输出特性”的强大功能。今天,我们将更进一步,通过一个完整的实战项目,将二级指针与文件I/O操作结合起来,学习如何动态、高效地读取和管理文件内容。 这个项目…

低代码开发实战案例,如何通过表单配置实现数据输入、数据存储和数据展示?

JVS低代码轻应用快速开发采用所见即所得的配置思路&#xff0c;表单是低代码中最基础的业务配置引擎之一&#xff0c;快速的通过表单配置实现数据输入、数据存储&#xff0c;数据展示。那么在轻应用下直接点开菜单打开的表单&#xff0c;录入数据提交到数据模型&#xff0c;后续…

数字孪生系统让汽车工厂虚实联动预测维护少停机

在汽车制造行业&#xff0c;设备突发停机往往会引发连锁反应&#xff0c;导致生产中断、成本飙升。传统运维模式依赖人工巡检与事后维修&#xff0c;难以应对复杂生产场景下的设备管理需求。如今&#xff0c;数字孪生系统凭借虚实联动的核心能力&#xff0c;为汽车工厂打造预测…

iceberg1.2.0 修改表与覆盖写

版本iceberg 1.2.0修改表只支持HiveCatalog表修改表属性&#xff0c;Iceberg表属性和Hive表属性存储在HMS中是同步的修改外部表删表时是否删除数据的表属性&#xff0c;这里是修改为删除表时不删除数据alter table iceberg_test1 set TBLPROPERTIES(external.table.purgeFALSE)…

Mini-Omni: Language Models Can Hear, Talk While Thinking in Streaming

2024.8tsinghuamethodwhisper encoder: whisper smallLLM Qwen0.5b init预测方式&#xff1a;text 7*audio token&#xff0c; parallel generation的方式预测&#xff0c;delay-step1----先预测文本token&#xff0c;再预测SNAC 第一级码本&#xff0c;然后序列化的逐渐预测后…

【MATLAB例程】基于UKF的IMM例程,模型使用CA(匀加速)和CT(协调转弯)双模型,二维环境下的轨迹定位。附代码下载链接

本文介绍的MATLAB程序可以实现&#xff1a;基于交互式多模型&#xff08;IMM&#xff09;的无迹卡尔曼滤波&#xff08;UKF&#xff09;方法&#xff0c;用于二维平面中目标的运动状态估计。该算法结合了两个运动模型&#xff1a;匀速直线模型&#xff08;CV&#xff09;和匀速…

工厂智慧设备检测:多模态算法提升工业安全阈值

工厂智慧设备检测&#xff1a;从技术突破到场景化落地在工业4.0与智能制造的双重驱动下&#xff0c;工厂设备检测正经历从人工巡检到智能化监控的颠覆性变革。传统检测方式受限于人力成本、环境干扰及响应延迟&#xff0c;难以满足现代工厂对安全性、效率与可持续性的要求。而基…

复现论文《地形遮挡对GNSS干扰范围影响的高效仿真算法》

地形遮挡对GNSS干扰范围影响的高效仿真算法 1. 论文标题 论文标题为《地形遮挡对GNSS干扰范围影响的高效仿真算法》 2. 内容概括 该论文提出了一种高效计算地形遮挡对全球导航卫星系统(GNSS)干扰源干扰范围影响的新算法。传统基于视线可视域分析的方法存在大量冗余计算,本…

图论(2)算法之拓扑排序介绍

目录 一、什么是拓扑排序&#xff1f; 二、拓扑排序的算法实现 1 BFS算法实现 &#xff08;1&#xff09;算法思路 &#xff08;2&#xff09; 代码实现&#xff08;Java&#xff09; 2 DFS算法实现 &#xff08;1&#xff09;算法思路 &#xff08;2&#xff09; 代码实…

GoBy 工具联动 | GoBy AWVS 自动化漏扫工作流

GoBy 系统笔记导航 &#x1f680;&#xff1a;[网安工具] Web 漏洞扫描工具 —— GoBy 使用手册 AWVS 系统笔记导航 &#x1f680;&#xff1a;[网安工具] Web 漏洞扫描工具 —— AWVS 使用手册 0x01&#xff1a;GoBy AWVS —— 联动扫描简介 AWVS 是一款由 Acunetix 公司开…