首页 > 其他分享 >22. 括号生成

22. 括号生成

时间:2024-01-23 15:55:31浏览次数:25  
标签:curr 递归 22 int 生成 current 括号 ans

1.题目介绍

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

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

示例 2:
输入:n = 1
输出:["()"]

提示:
1 <= n <= 8

2.题解

2.1 暴力枚举

思路

我们利用递归枚举出n对括号(这里是n对,说明共有2n个括号)即共2^2n种情况,并在其中找到正确的括号匹配情况。
1.递归返回条件,一次次加入'('和')'后,最终字符串长度到达n之后,进行合法性检验,若正确,加入结果数组中
2.合法性检验,必须随时满足左边括号多于等于右边括号数量,最终两边括号数量必须相等。
3.递归过程,现将当前字符串加上'(',继续递归,后删除这个'(',再加上')'进行继续递归。
4.注意条件给的是n对,所以最开始填参数时,总数量应为2*n;

代码

class Solution {
private:
    bool vaild(string &curr){
        int balance = 0;
        for(char ch:curr){
            if (ch == '(') balance++;
            else balance--;
            if(balance < 0) return false;
        }
        return balance == 0;
    }
    void generateAll(vector<string> &ans, int n, string &current){
        if(n == current.size()){
            if(vaild(current)){
                ans.push_back(current);
            }   
            return;
        }
        current += '(';
        generateAll(ans,n,current);
        current.pop_back();
        current += ')';
        generateAll(ans,n,current);
        current.pop_back();
    }

public:
    vector<string> generateParenthesis(int n) {
        vector<string> ans;
        string current;
        generateAll(ans, 2*n, current);
        return ans;
    }
};

复杂度分析

2.2 回溯法

思路

方法2.1有一个问题,就是当已经出现了不满足情况的括号组合,他依旧会继续递归下去,直到达到总括号数才会进行合法性检验,这样就浪费了很多递归资源
我们这里在每次递归中加入两个标记位置,分别标记已有的左括号数和有括号数目,左括号数目open < n(总共2n,左边的肯定要<n, =n的时候再加就超出了),有括号数目close < open < n即可。

这里所谓的回溯就是,在遇到不满足递归条件的中途节点,不会继续递归,而是回溯到上一级节点。这里就是使用if判断直接跳过本次递归过程,函数完成后自动回溯上一级调用节点。

代码

class Solution {
private:
    void backtrack(vector<string> &ans, int n, int open, int close, string &curr){
        if(n*2 == curr.size()){
            ans.push_back(curr);
            return;
        }
        if(open < n){
            curr += '(';
            backtrack(ans, n, open + 1, close, curr);
            curr.pop_back();
        }
        if(close < open){
            curr += ')';
            backtrack(ans, n, open, close + 1, curr);
            curr.pop_back();
        }
    }
public:
    vector<string> generateParenthesis(int n) {
        vector<string> ans;
        string curr;
        backtrack(ans, n, 0, 0, curr);
        return ans;
    }
};

复杂度分析

标签:curr,递归,22,int,生成,current,括号,ans
From: https://www.cnblogs.com/trmbh12/p/17982651

相关文章

  • P2254 [NOI2005] 瑰丽华尔兹 题解
    P2254[NOI2005]瑰丽华尔兹搬运工单调队列优化DP还是先朴素,设\(f_{t\i\j\d}\)表示在第\(t\)个时刻,在\(i,j\)位置上,上一步是停留还是滑动的最大步数。这个就是四个方向随便转移。\(T_{max}=4*10^4\)这么做肯定不行。发现\(k\)很小,只有\(200\),所以不妨让\(k\)......
  • 【专题】中国中小企业数字化转型研究报告(2022)PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33471数字化转型指数报告2022合集根据“基础设施-平台-应用”三层指标体系,对全国300余个城市、10余个行业的数字化发展规模进行了评估。该报告提供了覆盖全国范围的季度数字化转型指数,为各行各业推进数字化转型提供了有益的参考。报告的评估结果可以......
  • templeetcode 22.括号生成
    leetcode22.括号生成第二十二题:括号生成1.回溯:publicList<String>generateParenthesis(intn){List<String>ans=newArrayList<String>();backtrack(ans,newStringBuilder(),0,0,n);returnans;}publicvoidbackt......
  • Oracle AWR报告自动生成异常
    监控平台收集不到wrh$_tablespace_space_usage表数据。awr报告没有任何快照信息。alter日志发现报错:SuspendingMMONslaveactionkewrmafsa_for82800seconds MMON进程trace文件报错如下:UnabletoscheduleaMMONslaveat:AutoFlushMain1Slaveactionhasbeen......
  • 基于信号量的环形队列的生成消费模型(万字长文详解)
    linux线程之信号量POSIX信号量阻塞队列的缺陷==这是一个我们自己的实现阻塞队列!==classBlockQueue{public:BlockQueue(constint&maxcap=gmaxcap):maxcap_(maxcap){pthread_mutex_init(&mutex_,nullptr);......
  • e4a开发的一款手机银行app虚拟转账回执单生成器源码分享下载 -23软件网
    编写一个虚拟转账回执单生成器的源码对于E4A(EasyforAndroid)开发环境来说是一个有趣的项目。E4A是一个简化Android应用开发的工具,它允许开发者使用较为简单的编程语言和工具来创建应用。以下是一个简单的示例代码,用于创建一个模拟的手机银行App中的虚拟转账回执单生成器。请注意......
  • python随机生成图片验证码第二篇
    Python生成随机验证码,需要使用PIL模块.安装: pip3installpillow基本使用1.创建图片fromPILimportImageimg=Image.new(mode='RGB',size=(120,30),color=(255,255,255))#在图片查看器中打开#img.show()#保存在本地withopen('code.png','wb')asf......
  • 01.22 ARC170 题解慢报
    补完了,来发题解慢报。AB就不写了。CPrefixMexSequence考虑DP,\(f(i,j)\)表示前\(i\)个数,填了\(j\)个不同的数。如果\(s_{i+1}=1\)那么这位唯一确定,只需要保证\(j<m\)即可转移到\(f(i+1,j+1)\);如果\(s_{i+1}=0\)那么可以选旧的数也可以选新的数,分别转移即可。D......
  • STM32CubeMX教程22 FSMC - 8080并行接口TFT-LCD驱动
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手2、实验目标使用STM32CubeMX软件配置STM32F407开发板FSMC接口驱动8080并行接口TFT-LCD显示,具体为使用FSMCBank......
  • 生成器 迭代器 可迭代对象 深拷贝浅拷贝 闭包 装饰器 正则
    ​ python的导包python采用的导包方式有多种如:importx(包名)     比如导包时importhashlib调用时hashlib.md5("123456".encode("utf-8"))     importx(包名).xxx(方法名)         比如导包时importos.path调用时path.join(postion,......