【Leetcode每日一题】 综合练习 - 括号生成(难度⭐⭐)(76)

embedded/2024/10/18 10:15:57/

1. 题目解析

题目链接:22. 括号生成

这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。

2.算法原理

问题描述

我们需要找出所有可能的、有效的括号序列。一个有效的括号序列指的是一个仅由'('和')'组成的字符串,并且满足以下条件:

  1. 左括号的数量始终大于等于右括号的数量,从左到右遍历字符串时。
  2. 左括号的总数与右括号的总数相等。
递归策略

我们采用递归的方法来解决这个问题。递归的核心在于,在每一步,我们都有两种选择:放置一个左括号或(在条件允许的情况下)放置一个右括号。

递归函数设计
void dfs(std::string& current, int step, int left)
  • current: 存储当前构建的括号序列的字符串。
  • step: 当前需要填入的位置(即current字符串的长度)。
  • left: 当前状态的字符串中已放置的左括号数量。
递归流程
  1. 递归结束条件
    • step等于目标长度(即2倍的括号对数)时,检查current是否为一个有效的括号序列。如果是,则将其加入答案列表中。
  2. 放置左括号
    • 如果left小于目标长度的一半(即剩余的位置足够放置等量的右括号),则可以在current的第step个位置放置一个左括号,并递归调用dfs函数,参数更新为step+1left+1。递归完成后,需要撤销这个左括号的放置,以便尝试其他可能性。
  3. 放置右括号
    • 如果当前已放置的右括号数量(step - left)小于已放置的左括号数量left,则可以在current的第step个位置放置一个右括号,并递归调用dfs函数,参数更新为step+1left(因为右括号的放置不影响左括号的数量)。同样,递归完成后需要撤销这个右括号的放置。

决策树的演示:

3.代码编写

class Solution {int left, right, n;string path;vector<string> ret;public:vector<string> generateParenthesis(int _n) {n = _n;dfs();return ret;}void dfs() {if (right == n) {ret.push_back(path);return;}if (left < n) // 添加左括号{path.push_back('(');left++;dfs();path.pop_back();left--; // 恢复现场}if (right < left) // 添加右括号{path.push_back(')');right++;dfs();path.pop_back();right--; // 恢复现场}}
};

The Last

嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。

觉得有点收获的话,不妨给我点个吧!

如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~


http://www.ppmy.cn/embedded/42049.html

相关文章

【C】求Sn=a+aa+aaa+aaaa+aaaaa的前n项之和

问题 求Snaaaaaaaaaaaaaaa的前n项之和&#xff0c;其中a是一个数字。 例如&#xff1a;当a为2&#xff0c;n为5&#xff1a;Sn222222222222222 整体分析 像之前的水仙花数一样&#xff08;如果你看过这篇的话&#xff09;&#xff0c;我们可以先把这个问题拆分为一个个小的问…

暴力数据结构之二叉树(堆的相关知识)

1. 堆的基本了解 堆&#xff08;heap&#xff09;是计算机科学中一种特殊的数据结构&#xff0c;通常被视为一个完全二叉树&#xff0c;并且可以用数组来存储。堆的主要应用是在一组变化频繁&#xff08;增删查改的频率较高&#xff09;的数据集中查找最值。堆分为大根堆和小根…

通过QSettings增删改查.ini文件内容

[Config] <-----------section DBDriverQODBC <-----------keyvalue DataBaseIP127.0.0.1 DataSourceNameLocal UserNamesa Password Port1433新增及修改接口 #include <QSettings> #include <QTextCodec> void SetConfigFile(QString …

CSS响应式

1、rem是什么 &#xff1f; rem是一个长度单位 px&#xff1a;绝对长度单位&#xff0c; 最常用em&#xff1a;相对长度单位&#xff0c;相对于父元素&#xff0c;不常用rem: 相对长度单位&#xff0c;相对于根元素&#xff0c;常用于响应式布局 2、响应式布局的常见方案 med…

618有哪些好物值得推荐?收下这份618必买好物清单

随着618购物节的脚步越来越近&#xff0c;你是不是已经开始摩拳擦掌&#xff0c;准备大肆采购一番了&#xff1f;在这个购物狂欢节里&#xff0c;要说哪些宝贝最值得你入手&#xff0c;那一定少不了数码家电类&#xff01;今天就给大家整理了一些我往期自用过还不错的数码家电好…

【Linux深度学习5.15(堡垒机)】

JumpServer堡垒机 使用堡垒机管理服务器 一. 环境 1.将jump压缩包上传至服务器并解压2.安装jump server./jumpserver install一直选择默认就可以3.启动jumpserver./jumpserver start4.测试windows : 浏览器访问ipLinux : ssh -p2222 adminip5.登录账号 : admin 密码 : admin…

Stable Diffusion超详细教程!本地部署 Stable Diffusion

前言 目前市面上比较权威&#xff0c;并能用于工作中的AI绘画软件其实就两款&#xff1a; Midjourney&#xff08;MJ&#xff09;Stable-Diffusion&#xff08;SD&#xff09; MJ需要付费使用&#xff0c;而SD开源免费&#xff0c;但是上手难度和学习成本略大&#xff0c;并…

Excel 每 N 列内容填成一行

Excel表格从第 2 列起&#xff0c;每 N 列为一组&#xff0c;以 N2 为例&#xff1a; ABCDEFG1IDType 1Count 1Type 2Count 2Type 3Count 321a640d290a32d12000a1900f600043f48000f3600e160054c46000e3100b120065e47000c3400d140076b64000b3600c1200 现在要进列转行&#xff…