文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 暴力回溯
    • 2.2 DP

1. 题目

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:["((()))","(()())","(())()","()(())","()()()"
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 暴力回溯

  • 利用栈检查是否有效

class Solution {public:vector<string> generateParenthesis(int n) {stack<char> stk;vector<string> ans;string str;int k = 2*n;bt(stk,k,0,str,ans);return ans;}void bt(stack<char> stk, int &k, int i, string str, vector<string> &ans){if(i == k){if(stk.empty())ans.push_back(str);return;}stk.push('(');bt(stk,k,i+1,str+"(",ans);stk.pop();if(!stk.empty()){stk.pop();bt(stk,k,i+1,str+")",ans);}}
};
  • 用左右括号数量来判断:任何时候,右括号不能大于左括号个数

class Solution {public:vector<string> generateParenthesis(int n) {vector<string> ans;string str;int k = 2*n;bt(0,0,k,0,str,ans);return ans;}void bt(int L, int R, int &k, int i, string str, vector<string> &ans){if(L < R)return;if(i == k){if(L == R)ans.push_back(str);return;}bt(L+1,R,k,i+1,str+"(",ans);bt(L,R+1,k,i+1,str+")",ans);}
};
class Solution { // 2020.3.27vector<string> ans;int N;vector<char> ch ={'(',')'};
public:vector<string> generateParenthesis(int n) {N = 2*n;string t;dfs(t,0,0,n,0);return ans;}void dfs(string& t, int l, int r, int n, int count){if(l<r || l > n || r > n)return;if(count == N){ans.push_back(t);return;}for(int i = 0; i < 2; ++i){t.push_back(ch[i]);if(i==0) dfs(t,l+1,r,n,count+1);else     dfs(t,l,r+1,n,count+1);t.pop_back();}}
};

2.2 DP

另有DP解法,见别人解答

class Solution { //DP
public:vector<string> generateParenthesis(int n) {if (n == 0) return {};if (n == 1) return { "()" };vector<vector<string>> dp(n+1);dp[0] = { "" };dp[1] = { "()" };for (int i = 2; i <= n; i++) {   //求dp[i] 在所有dp[0],...dp[i-1]的基础上进行组合for (int j = 0; j <i; j++) {for (string p : dp[j])for (string q : dp[i - j - 1]) {   //j对括号的p,+ 1对新括号 + i-j-1对括号的 q = i对括号string str = "(" + p + ")" + q;dp[i].push_back(str);}}}return dp[n];}
};

LeetCode 22. 括号生成(回溯/DP)相关推荐

  1. LeetCode 22. 括号生成(回溯+剪枝)

    题目描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 思路 详见链接 代码 from typing import List class Solution ...

  2. [DFS|剪枝] leetcode 22 括号生成

    [DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...

  3. Leetcode 22. 括号生成(递归+去重)

    22. 括号生成 思路: 递归+map去重: 递归函数声明: vector<string> generateParenthesis(int n); 递归出口: 当n=1时,返回{" ...

  4. leetcode - 22. 括号生成

    给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "(()())& ...

  5. LeetCode 22. 括号生成(Generate Parentheses)

    题目描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n =3,生成结果为: ["((()))","(()() ...

  6. leetcode 22.括号生成

    题目 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "(()( ...

  7. leetcode 22. 括号生成

    难度:中等 频次:62 题目: 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合. 解题思路:DFS DFS注意 构造一棵树,只要遍历就行了 递归结束条件是 ...

  8. Leetcode 22.括号生成 (每日一题 20210623)

    数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合.示例 1:输入:n = 3 输出:["((()))","(()())&quo ...

  9. LeetCode 22 括号生成

    https://leetcode-cn.com/problems/generate-parentheses/ 解决方案 class Solution {List<String> ans = ...

最新文章

  1. JavaWeb项目异常管理之log4j的使用教程
  2. 基于机器学习的web异常检测(转)
  3. UA OPTI570 量子力学 原子结构基础 公式与结论总结
  4. 如何做自己的服务监控?spring boot 2.x服务监控揭秘
  5. 混合式app php怎么打包,如何实现混合 App Web 资源的打包与增量更新
  6. centos7解决火狐浏览器fash安装问题
  7. 查看队列深度_不为人知的网络编程(十一):从底层入手,深度分析TCP连接耗时的秘密...
  8. 前端笔记-thymeleaf获取及回显input标签type=radio
  9. 快捷操作之争【原创】
  10. java执行查询postgresql得到中文乱码_PostgreSQL 初探
  11. Sublime Text 3中配置Python3的开发环境
  12. CRC校验和CRC各种算法
  13. 用H5新特性canvas绘制一个钟表
  14. 《阿里巴巴java规范》 Result 方式杂谈
  15. python爬高德地图_利用Python爬取高德地图数据
  16. 听书是怎样的一种体验
  17. Qcom平台 Camera 之开启调试 log
  18. JavaScript进阶(一)
  19. Linux操作系统中网络配置命令
  20. 2020年6月最新iOS面试题总结(答案篇)

热门文章

  1. Moldflow中文版注塑流动分析案例导航视频教程
  2. Duplicate interface definition for class
  3. 裸机中代码书写的细节总结
  4. LeetCode445——Add Two Numbers II(两个链表数据相加(从链表尾部开始),返回新链表)
  5. Web前端学习笔记:Bootstrap
  6. 基于Spring框架的Shiro配置
  7. 线性表的顺序表示和实现
  8. [转]详细介绍如何做关联
  9. STL中的set/map
  10. C语言必须写main函数?最简单的 Hello world 你其实一点都不懂!