二刷LeetCode--22. 括号生成(C++版本)回溯法例题

news/2024/7/20 20:10:24 标签: leetcode, c++, 深度优先

本题思路主要还是几种回溯法的使用,可以想象为二叉树,一直向左子树加入左括号,当加入的左括号到达最大限制,就回退到上一层,然后自然需要向右子树加入右括号,然后依次递归,还是需要注意递归的终止条件,在左右括号都达到最大的时候则需要将本次的结果存在最终的字符串数组中,本题相关报错

// class Solution {
// public:
//     vector<string> generateParenthesis(int n) {
//         vector<string> res;
//         string path;
//         dfs(path,0 ,0, n, res);
//         return res;
//     }

//     void dfs(string path,int left, int right, int n, vector<string> &res)
//     {
//         if(left == n && right == n)
//             {
//                 res.push_back(path);
//                 return ;
//             }
//         // 左子树的深度就是[0, n)
//         if(left < n)
//         {
//             // 左子树加左括号
//             path += "(";
//             // 向下一层,继续递归直到走到对应深度
//             dfs(path, left + 1, right, n, res);
//             // 返回上一层
//             path.pop_back();
//         }
//         // 当右子树的深度小于左子树的时候就可以继续增加
//         if(right < left)
//         {
//             path += ")";
//             // 右子树同样向下增加一层然后通过递归来添加右括号
//             dfs(path, left, right + 1, n, res);
//             // path.pop_back();
//         }
//     }
// };



// class Solution {
// public:
//     vector<string> generateParenthesis(int n) {
//         vector<string> res;
//         int lc = 0, rc = 0;
//         dfs(res, "", n, lc, rc);
//         return res;
//     }
//     void dfs(vector<string>& res, string path, int n, int lc, int rc) {
//         if (rc > lc || lc > n || rc > n) return;
//         if (lc == rc && lc == n) {
//             res.push_back(path);
//             return;
//         }
//         dfs(res, path + '(', n, lc + 1, rc);
//         dfs(res, path + ')', n, lc, rc + 1);
//     }
// };

class Solution {
public:
    vector<string> res;
    vector<string> generateParenthesis(int n) {
        dfs("", n, n);
        return res;
    }
    // 这里必须是const否则报错
    void dfs(const string& tmp, int left, int right)
    // void dfs(string& tmp, int left, int right) 
    {
        if(left < 0 || left > right)
            return ;
        if(left == 0 && right == 0)
        {
            res.push_back(tmp);
            return ;
        }
        dfs(tmp + '(', left - 1, right);
        dfs(tmp + ')', left, right - 1);
    }
};


http://www.niftyadmin.cn/n/437461.html

相关文章

Promise、 Asyncawait 、setTimeOut执行顺序及区别

Promise、 Async/await 、setTimeOut执行顺序及区别 1、阐述 Promise是一种异步编程的解决方案&#xff0c;用于处理异步操作并返回结果或错误。Promise对象有三种状态&#xff1a;pending&#xff08;进行中&#xff09;、fulfilled&#xff08;已成功&#xff09;和rejected…

虚拟机防火墙怎么开放emqx网页18083端口给主机

要在虚拟机的防火墙中开放EMQX网页18083端口&#xff0c;以便主机可以访问&#xff0c;请按照以下步骤进行操作&#xff1a; 确定防火墙状态&#xff1a;在虚拟机上运行以下命令检查防火墙状态&#xff1a; sudo firewall-cmd --state如果防火墙状态为"running"&am…

raku疑难进阶手册(3)

目录 对象和类变量与标识符简单输出预定义变量程序基本结构绑定和赋值 对象和类 大部分数据都是对象&#xff0c;每个对象知道定义自己的类类可以继承调用构造器可创建对象 通常名为new 比如有理数 [0] > my $xRat.new(11)小数&#xff0c;参数分别为分子和分母 [6] >…

一组网格加载动画

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网格动画</title><style>import url("https://fonts.googleapis.com/css2?familyOrb…

2023年5月青少年软件编程(Python) 等级考试试卷(二级)

青少年软件编程&#xff08;Python&#xff09; 等级考试试卷&#xff08;二级&#xff09; 一、 单选题(共 25 题&#xff0c; 共 50 分) 1.运行以下程序&#xff0c; 如果通过键盘先后输入的数是 1 和 3&#xff0c; 输出的结果是&#xff1f; &#xff08; &#xff09; ain…

实现c++中__builtin_popcount()函数相同效果的代码

自己用实现c中的__builtin_popcount()功能相同的代码。 // c 中__buitin_popcount()作用是统计一个数中二进制形式下1的个数 // int x 7; __builtin_pop(x);以上代码将返回3 我们可以自己写一段代码来实现该函数相同的功能。 int x 7,cnt 0; while(x > 0){x & (x-…

ubuntu 22.04安装mysql 8.0与避坑指南

MySQL 是一个开源数据库管理系统&#xff0c;可作为流行的 LAMP&#xff08;Linux、Apache、MySQL、PHP/Python/Perl&#xff09;堆栈的一部分安装。 它实现了关系模型并使用结构化查询语言&#xff08; SQL&#xff09;来管理其数据。 本教程将介绍如何在 Ubuntu 22.04 服务器…

Vue-Element-Admin项目学习笔记(7)用Node.js写一个简单后端接口

前情回顾&#xff1a; vue-element-admin项目学习笔记&#xff08;1&#xff09;安装、配置、启动项目 vue-element-admin项目学习笔记&#xff08;2&#xff09;main.js 文件分析 vue-element-admin项目学习笔记&#xff08;3&#xff09;路由分析一:静态路由 vue-element-adm…