【LeetCode】【动态规划】Generate Parentheses(括号匹配问题)
描述
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路1——DP
设:P[i]表示当n=i的时候括号组合串。 观察规律:我们知道,要形成一个括号的组合,肯定不是凭空产生的,产生一个P[3]的组合,那肯定是把"("和")"分别插在P[2]中间的。
我们假设产生P[3]组合的时候,之前的组合都是正确的,那么通过插入"(",")"肯定会把P[2]分成两个部分(括号内一个,括号外一个)
看似好像有很多插入的方法,但是,其实仔细想想,反正"("得增加一个,由于括号组合的第一一定是"(",为什么不把新增的"("放在开头呢?这样我们就只用考虑")"了
会怎么把P[2]切割就好了,我们知道P[2]的组合有P[0]+P[2],P[1]+P[1],P[2]+P[0],
通过写出前几个可以观察到下面的规律
P[0]= [""]
P[1] = [()] = "("+P[0]+")"+P[0]
P[2] = [()(),(())] = "("+P[0]+")"+P[1] , "("+P[1]+")" +P[0]
P[3] = [()()(),()(()),(())(),(()()),((()))] = "("+P[0]+")"+P[2] , "("+P[1]+")"+P[1], "("+P[2]+")" +P[0]
我们可以知道了组合方式:
- P[i] = "("+P[i-j-1]+")"+P[j] (j<i,j=0,1,2,......)
//dp[0] = ""
//dp[i]='('+ dp[k]+')'+dp[i-1-k],k=0..i-i
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector< vector<string> > dp(n+, vector<string>());
dp[].push_back("");
for(int i=; i<=n; ++i){
for(int k=; k<i; ++k){
for(string s1: dp[k]){
for(string s2: dp[i--k])
dp[i].push_back("("+s1+")"+s2);
}
}
}
return dp[n];
}
};
思路2:回溯
假设我能枚举所有的情况,我们考虑合理的括号组合是什么样的:
- 左括号数==右括号数
- 左括号一定要先于右括号
所以我们可以用一个大数组来表示字符串,2个指针leftpare_need,moreleft来表示左右括号,我们递归遍历所有情况,把满足条件的情况加入list就行了
class Solution {
public:
vector<string> result;
vector<string> generateParenthesis(int n) {
helper("", n, );
return result;
} /* this hepler function insert result strings to "vector<string> result"
When number of '(' less than "n", can append '(';
When number of '(' is more than number of ')', can append ')'; string s : current string;
int leftpare_need : number of '(' that have not put into "string s";
int moreleft : number of '(' minus number of ')' in the "string s";
*/ void helper(string s, int leftpare_need, int moreleft)
{
if(leftpare_need == && moreleft == )
{
result.push_back(s);
return;
}
if(leftpare_need > )
helper(s + "(", leftpare_need - , moreleft+);
if(moreleft > )
helper(s + ")", leftpare_need, moreleft - );
}
};
【LeetCode】【动态规划】Generate Parentheses(括号匹配问题)的更多相关文章
- [LeetCode]22. Generate Parentheses括号生成
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- leetcode 20 Valid Parentheses 括号匹配
Given a string containing just the characters '(', ')', '{', '}', '[' and']', determine if the input ...
- 蜗牛慢慢爬 LeetCode 22. Generate Parentheses [Difficulty: Medium]
题目 Given n pairs of parentheses, write a function to generate all combinations of well-formed parent ...
- LeetCode 20 Generate Parentheses
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- 【题解】【排列组合】【回溯】【Leetcode】Generate Parentheses
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...
- 集训第五周动态规划 J题 括号匹配
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- LeetCode 第20题--括号匹配
1. 题目 2.题目分析与思路 3.代码 1. 题目 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭 ...
- LeetCode 022 Generate Parentheses
题目描述:Generate Parentheses Given n pairs of parentheses, write a function to generate all combination ...
- LeetCode 22 Generate Parentheses(找到所有匹配的括号组合)
题目链接 : https://leetcode.com/problems/generate-parentheses/?tab=Description 给一个整数n,找到所有合法的 () pairs ...
- 【LeetCode】22. Generate Parentheses 括号生成
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:括号, 括号生成,题解,leetcode, 力扣,Pyt ...
随机推荐
- PIVOT 和 UPIVOT 的使用(行转列)
PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合.UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列 ...
- DialogFragment创建默认dialog
代码地址如下:http://www.demodashi.com/demo/12228.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 前言 在我们项目的进行中不可避免 ...
- BF的真正意义
http://www.jianglb.com/2010/11/25/whatisbf.html一个小男孩对小女孩说:“我是你的BF.”女孩扬起童真的脸,问:“什么是BF?”男孩嘻嘻笑道:“是BestF ...
- 关于清理 mac 其他文件的的方法
mac 用于开发使用时间长硬盘会越来越小,速度越来越慢的, 亦是花了几分钟研究怎么清理系统的缓存, 方法: 1,到 https://www.omnigroup.com/more/ 安装 OmniDis ...
- centos源码安装lnmp
参考博客:http://blog.csdn.net/yanzi1225627/article/details/49123659 服务器环境为:CentOS6.6 64位(虚拟机) 一.安装前准备 创建 ...
- 转 【MQTT】在Windows下搭建MQTT服务器
MQTT简介 MQ 遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放.简单.轻量.易于实现.这些特点使它适用于受限环境.该协议的特点有: 使用发布/订阅消息模式,提供 ...
- C# Html Agility Pack
using System; using HtmlAgilityPack; using System.IO; using System.Text; using System.Text.RegularEx ...
- Fiddler 过滤器的使用
只显示制定HOST的SESSION
- Nginx日志配置与切割
访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义.通过访问日志,你可以得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息. Nginx中访问日志相关指令主要有两条,一条是 ...
- org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: Unknown column 'viewpoint' in 'field list'
问题描述:当我在model中添加了一下代码以后数据库报错: 添加的代码为: private Viewpoint viewpoint; public Viewpoint getViewpoint() { ...