首页 > 编程语言 >C++刷题笔记-括号生成

C++刷题笔记-括号生成

时间:2024-12-11 21:21:59浏览次数:5  
标签:cur int res C++ 括号 vector open 刷题

一、题目描述

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

二、测试用例

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

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

三、回溯法求解

回溯算法会系统地探索所有可能的候选解,当确定某个候选解不可能是有效的解时,算法会回溯到之前的状态,放弃当前的候选解,并继续探索下一个候选解。在本题中我们可以只在序列仍然保持有效时才添加 ‘(’ 或 ‘)’,通过记录当前字符串中的左括号和右括号次数来实现这一点。

如果左括号数量 open 不大于 n ,我们可以放一个左括号。如果右括号数量 close 小于左括号的数量 open ,我们可以放一个右括号,代码如下:

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

四、解法二

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> res;
        generateDFS(n, n, "", res);
        return res;
    }
    
    void dfs(int left, int right, string out, vector<string> &res)
    {
        if(left>right)
            return ;
        if(left == 0 && right == 0)
            res.push_back(out);
        else {
            if (left > 0) 
                dfs(left - 1, right, out + '(', res);
            if (right > 0) 
                dfs(left, right - 1, out + ')', res);
        }
    }
};

标签:cur,int,res,C++,括号,vector,open,刷题
From: https://www.cnblogs.com/KevinScott0582/p/18599967

相关文章

  • C++学习笔记 printf语句与判断结构
    一、printf输出格式注意:使用printf时最好添加头文件`#include`。#include<iostream>#include<cstdio>usingnamespacestd;intmain(){printf("HelloWorld!");return0;}int、float、double、char等类型的输出格式:(1)int:%d(2)float:%f,默认保......
  • C++中的虚函数和纯虚函数
     在C++中,虚函数和纯虚函数都有助于实现多态性,但它们之间有几个重要的区别。 一、虚函数(VirtualFunction)1.定义:当你在基类中使用virtual关键字声明一个成员函数时,你就创建了一个虚函数。这意味着即使通过基类指针或引用调用了该函数,实际执行的可能是派生类中重写的......
  • C++学习笔记 入门及简单的顺序结构
    编写一个简单的C++程序——手速练习#include<iostream>usingnamespacestd;intmain(){cout<<"HelloWorld"<<endl;return0;}语法基础变量的定义变量必须先定义,才可以使用。不能重名。变量定义的方式:#include<iostream>usingnamespacestd;......
  • 《智领未来:C++ 与遗传算法在 AI 模型参数优化中的深度融合》
    在人工智能领域,模型的性能往往取决于众多参数的合理设置。而遗传算法,作为一种强大的优化工具,为寻找最优参数提供了一种高效且智能的途径。当我们将遗传算法与C++的高效性能相结合时,更能在人工智能模型参数优化中大展身手。本文将深入探讨在C++中实现遗传算法并应用于人工......
  • 《数据流驱动:C++构建 AI 模型持续学习新范式》
    在人工智能领域不断发展演进的浪潮中,数据的持续流入和模型的适应性学习成为了新的焦点。传统的人工智能模型训练往往基于固定的数据集,在模型训练完成后难以有效地处理新到达的数据并持续提升性能。而基于数据流的人工智能模型持续学习系统则能够打破这种局限,让模型在动态变......
  • 【最新原创毕设】基于SpringBoot的学生选课管理系统+56695(免费领源码)可做计算机毕业设
    基于Springboot和Vue的学生选课管理系统的设计与实现摘 要本文介绍了一种基于SpringBoot和Vue的学生选课管理系统的设计与实现。该系统旨在提供一个高效、可靠的选课平台,使学生和教职工能够方便地进行课程选择和管理。在系统设计上,我们采用了SpringBoot作为后端框架,利用......
  • (2024最新毕设合集)基于的同城学校二手交易平台|可做计算机毕业设计JAVA、PHP、爬虫、AP
    同城学校二手交易平台设计与实现摘 要利用SpringBoot框架和相关Uni-app技术,设计和实现一个高效、可靠的同城学校二手交易平台。该系统将提供闲置、发布、求购等主要功能,旨在促进二手交易平台的便捷和透明化。本研究首先介绍了同城学校二手交易平台的研究背景和现状,包括同城......
  • 【C++】static 知识整理 【静态与局部静态】
    目录类外类内局部静态localstatic类外类内类外C++的静态可以分为两种情况来讨论:在类外和在类内。对于静态变量/函数,链接将只在内部(如果不用static,那么在不同文件定义同名变量会报错)声明定义在其他地方的变量需要使用extern,函数则不需要类内静态变量/方法将与类的所有实例......
  • 刷题专帖
    此贴从12.8日开始记录全部刷题,包括题型,日期+题名+难度。dp专练:12.8释放囚犯绿12.9乌龟棋绿12.9飞扬的小鸟绿12.10找爸爸绿splay:12.9普通平衡树蓝12.9文艺平衡树蓝阶段性结语(时不时更新):这段时间在主攻dp,并且将老师课程安排的题目也顺带刷一下。。11......
  • 打卡信奥刷题(408)用C++信奥B3884[普及组/提高] [信息与未来 2015] 加数
    [信息与未来2015]加数题目描述给出一个正整数nnn,在nnn的右边......