首页 > 其他分享 >LeetCode括号生成(/)

LeetCode括号生成(/)

时间:2023-02-03 01:33:25浏览次数:55  
标签:return cur int back 生成 current 括号 result LeetCode

原题解

题目

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

约束

解法

解法一


class Solution {
    bool valid(const string& str) {
        int balance = 0;
        for (char c : str) {
            if (c == '(') {
                ++balance;
            } else {
                --balance;
            }
            if (balance < 0) {
                return false;
            }
        }
        return balance == 0;
    }

    void generate_all(string& current, int n, vector<string>& result) {
        if (n == current.size()) {
            if (valid(current)) {
                result.push_back(current);
            }
            return;
        }
        current += '(';
        generate_all(current, n, result);
        current.pop_back();
        current += ')';
        generate_all(current, n, result);
        current.pop_back();
    }
public:
    vector<string> generateParenthesis(int n) {
        vector<string> result;
        string current;
        generate_all(current, n * 2, result);
        return result;
    }
};

解法二


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 {
    shared_ptr<vector<string>> cache[100] = {nullptr};
public:
    shared_ptr<vector<string>> generate(int n) {
        if (cache[n] != nullptr)
            return cache[n];
        if (n == 0) {
            cache[0] = shared_ptr<vector<string>>(new vector<string>{""});
        } else {
            auto result = shared_ptr<vector<string>>(new vector<string>);
            for (int i = 0; i != n; ++i) {
                auto lefts = generate(i);
                auto rights = generate(n - i - 1);
                for (const string& left : *lefts)
                    for (const string& right : *rights)
                        result -> push_back("(" + left + ")" + right);
            }
            cache[n] = result;
        }
        return cache[n];
    }
    vector<string> generateParenthesis(int n) {
        return *generate(n);
    }
};

标签:return,cur,int,back,生成,current,括号,result,LeetCode
From: https://www.cnblogs.com/chuixulvcao/p/17087869.html

相关文章

  • LeetCode 对称二叉树算法题解 All In One
    LeetCode对称二叉树算法题解AllInOne对称二叉树原理图解101.SymmetricTree对称二叉树https://leetcode.com/problems/symmetric-tree/https://leetcode.c......
  • Luogu5435 基于值域预处理的快速 GCD & Leetcode2543 - binary GCD -
    题目链接:https://www.luogu.com.cn/problem/P5435请忽略题目名称学到一个科技:binaryGCD,能够快速求出两个数GCD(从这道题来看已经接近\(O(1)\)了)代码://bySkyRainW......
  • Qt Creator9.0生成工程后没有.pro文件
    QtCreator9.0默认建立的widget项目只有CMakeLists.txt文件,没有pro文件发现生成工程文件时默认选择的是cmake,不是qmake导致的这个问题,将Builldsystem中转化成qmake之后......
  • 浅谈python容器、迭代器与生成器
    前言:for...in...循环时,与while不同的是,for可以自动访问容器中的下一个元素,这是为什么呢?#用while循环访问列表容器iter_a=iter(a)whileTrue:try:print(ne......
  • mybatis-plus代码生成器
    用idea建一个javaproject项目,然后在pom.xml中加入以下依赖<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifac......
  • leetcode-543二叉树直径
    //leetcodesubmitregionbegin(Prohibitmodificationanddeletion)/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;......
  • #yyds干货盘点# LeetCode面试题:两数相加
    1.简述:给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表......
  • #yyds干货盘点# LeetCode程序员面试金典:幂集
    题目:幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。说明:解集不能包含重复的子集。示例:输入:nums=[1,2,3]输出:[ [3], [1], [2], [1,2,3],......
  • kubeadm 部署的 k8s 增加 ip 并重新生成证书
    目录上集回顾正片开始备份kubernetes目录查看证书内的ip生成集群配置删除原有的证书重新生成证书将配置更新到configmap中上集回顾上一篇文章利用memberupdate......
  • LeetCode.150 逆波兰表达式求值
    1.题目给你一个字符串数组 ​​tokens​​​ ,表示一个根据 ​​逆波兰表示法​​ 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。2.代码classSolu......