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

LeetCode 22 括号生成

时间:2023-04-20 19:59:26浏览次数:34  
标签:tmp 22 插入 int res 括号 LeetCode dp

LeetCode | 22.括号生成

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 8

方案一:递归

  当有 n 对括号时,字符串的长度为 2n。此时可以插入的 '(' 数量为 n, 可以插入的 ')' 数量为 0 (要有对应的左括号才可以插入右括号,否则就是非法的)。

开始递归:

  • 插入一个左括号后,可插入的左括号数量减一,可插入的右括号数量加一
  • 插入一个右括号后,可插入的右括号数量减一
  • 退出条件:当可插入的左右括号数量都为 0 时,退出递归
vector<string> generateParenthesis(int n) {
    vector<string> res;
    string tmp = "";
    helper(res, tmp, n, 0);
    return res;
}

void helper(vector<string>& res, string& tmp, int l, int r) {
    if (l == 0 && r == 0) {
        res.push_back(tmp);
        return;
    }
    if (l > 0) {
        tmp.push_back('(');
        helper(res, tmp, l - 1, r + 1);
        tmp.pop_back();
    }
    if (r > 0) {
        tmp.push_back(')');
        helper(res, tmp, l , r - 1);
        tmp.pop_back();
    }
}

方案二:动态规划

  设 dp[i] 包含长度为 2*i 的所有有效括号组合。
  假设你已经得到了dp[2],它是{(()),()()}。那么dp[3]将是什么呢?可以写成以下形式:

( + dp[0] + ) + dp[2] = ()(()) 和 ()()()
( + dp[1] + ) + dp[1] = (())()
( + dp[2] + ) + dp[0] = ((())) 和 (())()

因此,可以看到,这个问题具有重叠子问题的结构。

dp[i] = "(" + dp[j] + ")" + dp[i-j-1]

注意: dp[j] 和 dp[i - j - 1] 都包含多个字符串,要遍历出所有可能的情况

vector<string> generateParenthesis(int n) {
    vector<vector<string>> dp(n + 1);
    dp[0] = {""};
    for (int i = 1; i <= n; ++i) {
        for (int j = 0; j < i; ++j) {
            vector<string> left = dp[j];
            vector<string> right = dp[i - j - 1];
            for (int l = 0; l < left.size(); ++l) {
                for (int r = 0; r < right.size(); ++r) {
                    dp[i].push_back("(" + left[l] + ")" + right[r]);
                }
            }
        }
    }
    return dp[n];
}

标签:tmp,22,插入,int,res,括号,LeetCode,dp
From: https://www.cnblogs.com/AngleLin/p/17338102.html

相关文章

  • LeetCode 周赛 341 场,模拟 / 树上差分 / Tarjan 离线 LCA / DFS
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。上周末有单双周赛,双周赛我们讲过了,单周赛那天早上有事没参加,后面做了虚拟竞赛,然后整个人就不好了。前3题非常简单,但第4题有点东西啊,差点就放弃了。最后,被折磨了一个下午和一个大夜......
  • LeetCode-Go:一个使用 Go 语言题解 LeetCode 的开源项目
    在中国的IT环境里,大多数场景下,学习算法的目的在于通过笔试算法题。但算法书林林总总,有时候乱花渐欲迷人眼。杜甫有诗云:读书破万卷,下笔如有神。不管选择哪本书,只要深入学习,分层次,逐层进阶,一定可以将算法攻克。笔者强烈推荐一个Github开源项目LeetCode-Go,你不仅可以把他当做......
  • 2022上半年系统集成项目案例分析真题解析(广东卷)
    2022上半年系统集成项目案例分析真题解析(广东卷)......
  • 2022上半年系统集成项目综合知识真题及解析(广东卷)
    ......
  • LeetCode Top100: 买卖股票的最佳时机 (python)
    LeetCodeTop100: 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这......
  • 22 21 | 高性能设计,一切都围绕着契约精神
    你好,我是乔新亮。这一讲,我们来聊聊如何实现架构的高性能设计。前面我们讲过,产品思维有两个核心关键词:“契约精神”和“洞察人性”。其实高性能设计,也和契约精神是密切相关的。我将其总结为:高性能设计,一切围绕着契约精神。你可能会想,高性能设计不就是可以支撑大流量、高并发的架......
  • 23 22 | 扩展性设计,看透业务的本质
    你好,我是乔新亮。这一讲,我想和你聊聊,如何做好扩展性设计。说到扩展性设计,可能你的第一反应是业务拆分、集群扩容等等。说得没错,这些都能增强系统的扩展性,但仅仅局限于架构和技术层面。我的下属经常兴奋地向我描述,说他实现了一个非常厉害的、高性能、高可扩展性的系统。我的回答......
  • LeetCode Top100:回文链表 (python)
    LeetCodeTop100:回文链表给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,105] 内0<=Node.val<=9 ......
  • P5322 BJOI2019 排兵布阵
    P5322BJOI2019排兵布阵本题主要考察对模型的转化能力。首先要察觉两条性质:对于一个城堡,想打败一个玩家的同时用最少的士兵,肯定是正好派出这个玩家在这个城堡派出的士兵数量的二倍加一名士兵。在一个城堡上,打败了一个在这个城堡派出士兵数量为\(x\)的玩家,就可以顺便打败所......
  • LeetCode Top100: 相交链表(Python)
    LeetCodeTop100:相交链表给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原......