LeetCode 22. 括号生成(回溯/DP)
文章目录
- 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)相关推荐
- LeetCode 22. 括号生成(回溯+剪枝)
题目描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 思路 详见链接 代码 from typing import List class Solution ...
- [DFS|剪枝] leetcode 22 括号生成
[DFS|剪枝] leetcode 22 括号生成 1.题目 题目链接 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合. 示例: 输入:n = 3 输出:[& ...
- Leetcode 22. 括号生成(递归+去重)
22. 括号生成 思路: 递归+map去重: 递归函数声明: vector<string> generateParenthesis(int n); 递归出口: 当n=1时,返回{" ...
- leetcode - 22. 括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "(()())& ...
- LeetCode 22. 括号生成(Generate Parentheses)
题目描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n =3,生成结果为: ["((()))","(()() ...
- leetcode 22.括号生成
题目 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "(()( ...
- leetcode 22. 括号生成
难度:中等 频次:62 题目: 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合. 解题思路:DFS DFS注意 构造一棵树,只要遍历就行了 递归结束条件是 ...
- Leetcode 22.括号生成 (每日一题 20210623)
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合.示例 1:输入:n = 3 输出:["((()))","(()())&quo ...
- LeetCode 22 括号生成
https://leetcode-cn.com/problems/generate-parentheses/ 解决方案 class Solution {List<String> ans = ...
最新文章
- JavaWeb项目异常管理之log4j的使用教程
- 基于机器学习的web异常检测(转)
- UA OPTI570 量子力学 原子结构基础 公式与结论总结
- 如何做自己的服务监控?spring boot 2.x服务监控揭秘
- 混合式app php怎么打包,如何实现混合 App Web 资源的打包与增量更新
- centos7解决火狐浏览器fash安装问题
- 查看队列深度_不为人知的网络编程(十一):从底层入手,深度分析TCP连接耗时的秘密...
- 前端笔记-thymeleaf获取及回显input标签type=radio
- 快捷操作之争【原创】
- java执行查询postgresql得到中文乱码_PostgreSQL 初探
- Sublime Text 3中配置Python3的开发环境
- CRC校验和CRC各种算法
- 用H5新特性canvas绘制一个钟表
- 《阿里巴巴java规范》 Result 方式杂谈
- python爬高德地图_利用Python爬取高德地图数据
- 听书是怎样的一种体验
- Qcom平台 Camera 之开启调试 log
- JavaScript进阶(一)
- Linux操作系统中网络配置命令
- 2020年6月最新iOS面试题总结(答案篇)