首页 > 编程语言 >力扣第22题:括号生成 深度优先搜索(DFS)和它的优化(C++)

力扣第22题:括号生成 深度优先搜索(DFS)和它的优化(C++)

时间:2024-07-06 22:27:55浏览次数:27  
标签:22 int 平台 dfs 力扣 括号 DFS str

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

示例 :

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

思路
递出去,再归回来,是为递归。DFS算法是利用递归思想的一种搜索算法。
想象一个矿井,从地面到井底有多层平台,每层平台都能从此处向下连接到一个不同的矿底,我们先一路探到底,发现最底部无矿后再向上爬一个平台,然后走向这个平台连接的矿底。
DFS就是利用不停地回溯回退到之前的状态并做出不同的选择的算法。

解题过程
对于这道题目,DFS一开始接收到空字符串,然后进入函数体后判断剪枝情况(我们可以利用已知信息来判断继续向下探还能否得到结果的可能性),然后分别递入下一级DFS(两个分支分别加上左括号'('和右括号')')。
我们定义l和r记录左右括号的当前数量,如果 右括号多于左括号||右括号多于n个||左括号多于n个 都不可能得到一个拥有全部由小括号的字符串了。
判断可行性后加入到答案中。
实测击败全世界。

Code

class Solution {
public:
    vector<string>ans;
    vector<string> generateParenthesis(int n) {
        dfs("",n,0,0);
        return ans;
    }
    inline void dfs(string str,int n,int l,int r){
        if(r>l||r>n||l>n)return ;
        if(l==r&&l==n)ans.push_back(str);
        dfs(str+'(',n,l+1,r);
        dfs(str+')',n,l,r+1);
    }
};

标签:22,int,平台,dfs,力扣,括号,DFS,str
From: https://blog.csdn.net/dakingffo/article/details/140236369

相关文章

  • 力扣第6题:Z字形变换 交替V和Λ规律法(C++)
    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:PAHNAPLSIIGYIR之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。......
  • P7224 [RC-04] 子集积 (背包 dp + 复杂度优化)
    P7224[RC-04]子集积背包dp+复杂度优化考虑dp。容易想到背包dp,设\(f_{i,j}\)表示考虑了前\(i\)个,当前乘积为\(j\)的方案数。枚举\(a_i\)的倍数转移。复杂度\(O(\sum\limits_{i=1}^n\frac{m}{a_i})\)。如果\(a_i\)互不相同,那么近似于\(O(m\lnm)\)。如果还想......
  • 【AcWing】842. 排列数字(DFS)
    DFS是树形结构,深度优先搜索。dfs可以算作递归。横线上填和前面不一样的数字。每一次向下探索都一条路走到黑,直到不能走再回溯。#include<iostream>usingnamespacestd;constintN=10;intn;intpath[N];//存放走过的路径boolst[N];//存放1~n哪个数用过了,全局b......
  • P9668 [ICPC2022 Jinan R] Torch 题解
    思路考虑使用矩阵模拟这个过程。首先,我们可以设初值为:\[\begin{bmatrix}0&1\end{bmatrix}\]表示瘦子初始走\(0\)米,胖子初始走\(1\)米。考虑瘦子走一步。由于瘦子每走一步都不能超过胖子,我们可以使用\((\min,+)\)矩乘来维护这个性质。那么瘦子走一步是:\[\begin{bma......
  • 3101.力扣每日一题7/6 Java(接近100%解法)
    博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......
  • MIT6.824-2022 分布式系统课程实验笔记 Lab 2A Raft-领导者选举(leader election)--xu
    Lab2A:Raft文章目录Lab2A:RaftLab1:MapReduceLab2:Raft实验解读Lab2B:日志复制我的代码实现(附带详细代码注释)前言Part2A:[leaderelection](中等难度)提示错误:实现细节(包含对于方法的解释如有错误大佬勿喷)结构体GetState()获取节点任期和角色sendAllRequestVote()发起投票......
  • MIT6.824-2022 分布式系统课程实验笔记 Lab 2B Raft-日志复制(Log Replication)--xunznu
    Part2B:LogReplication日志复制(困难)文章目录Part2B:LogReplication日志复制(困难)Lab1:MapReduceLab2:Raft实验解读Lab2A:领导者选举leaderelection我的代码实现(附带详细代码注释)提示:实现细节:1、commitIndex和lastApplied2、nextIndex和matchIndex3、Co......
  • Ubuntu 22.04.4 LTS 安装 php apache LAMP 环境nginx
    1安装php-fpmaptupdateapt-getinstallphp-fpm#配置php-fpm服务启动systemctlenablephp8.1-fpmsystemctlstartphp8.1-fpm#查看服务systemctlstatusphp8.1-fpm#查看版本root@iZbp1g7fmjea77vsqc5hmmZ:~#php-vPHP8.1.2-1ubuntu2.18(cli)(built:......
  • 【力扣】每日一题—第217题,存在重复元素
    目录题目:开始思路:更改思路:上代码:题目:给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。开始思路:暴力求解两重for循环直接出结果,但是超时了!!!超时了命苦!!!更改思路:先排序后遍历成功了哎,不过如此,嘿嘿嘿......
  • 【力扣】每日一题—第242题,有效的字母异位词
    目录题目:开始思路:最后思路:最终代码:题目:给定两个字符串*s*和*t*,编写一个函数来判断*t*是否是*s*的字母异位词。注意:若*s*和*t*中每个字符出现的次数都相同,则称*s*和*t*互为字母异位词。开始思路:判断字母长度,不相等直接返回false,相等再将两个字符串排......