描述

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:回溯

假设我能枚举所有的情况,我们考虑合理的括号组合是什么样的:

  1. 左括号数==右括号数
  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(括号匹配问题)的更多相关文章

  1. [LeetCode]22. Generate Parentheses括号生成

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  2. leetcode 20 Valid Parentheses 括号匹配

    Given a string containing just the characters '(', ')', '{', '}', '[' and']', determine if the input ...

  3. 蜗牛慢慢爬 LeetCode 22. Generate Parentheses [Difficulty: Medium]

    题目 Given n pairs of parentheses, write a function to generate all combinations of well-formed parent ...

  4. LeetCode 20 Generate Parentheses

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  5. 【题解】【排列组合】【回溯】【Leetcode】Generate Parentheses

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  6. 集训第五周动态规划 J题 括号匹配

    Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...

  7. LeetCode 第20题--括号匹配

    1. 题目 2.题目分析与思路 3.代码 1. 题目 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭 ...

  8. LeetCode 022 Generate Parentheses

    题目描述:Generate Parentheses Given n pairs of parentheses, write a function to generate all combination ...

  9. LeetCode 22 Generate Parentheses(找到所有匹配的括号组合)

    题目链接 : https://leetcode.com/problems/generate-parentheses/?tab=Description   给一个整数n,找到所有合法的 () pairs ...

  10. 【LeetCode】22. Generate Parentheses 括号生成

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:括号, 括号生成,题解,leetcode, 力扣,Pyt ...

随机推荐

  1. 【Datasatge】使用Datastage装载数据时候,报错:Missing record delimiter “”,saw EOF instead

    如题,报错截图如下: 根据以上警告信息我们可以清晰看出,是字段DEFAULT_FLAG出错了!于是我们找到对应的字段,结果一看,导出文件中DS表结构中该字段为DECIMAL(18,2),但是导出文件中 ...

  2. MATLAB 2014a 在Mac os x yosemite 10.10 Retina显示模糊的解决的方法

    恐怕非常多童鞋在升级了yosemite之后都遇到了Matlab的问题. 之前转载的一篇文章写了安装的方法,本文说一下解决Retina屏显示模糊的办法. 那么因为Matlab 2014a使用自带的jav ...

  3. Jmeter3.0-多维度的图形化HTML报告

    本文转载于推酷:http://www.tuicool.com/articles/BNvuEzr 在JMeter3.0之前,官方只提供在工具的UI上对测试结果部分维度的图形化展示,这对我带来了两方面的困 ...

  4. sprint3 【每日scrum】 TD助手站立会议第九天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 整合原来做过的功能,并做相应的改进,整合其他的功能 团队进入最终的功能测试阶段,准备发布Beta版 在测试阶段BUG太多,不知道如何解决 Y ...

  5. 征信报告页面的input验证收集

    https://ipcrs.pbccrc.org.cn/ function checkLoginName() { var loginName = $.trim($("#loginname&q ...

  6. C# SqlBulkCopy类批量导入数据

    特别注意  sqlbulkcopy.ColumnMappings.Add(dt.Columns[i].ColumnName, dt.Columns[i].ColumnName); 插入的时候列的顺序可 ...

  7. android常用权限

    访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permiss ...

  8. PYTHON测试邮件系统弱密码

    #-*- coding:utf-8 -*- #测试公司邮件系统弱密码, from email.mime.text import MIMEText import smtplib #弱密码字典 passL ...

  9. 如何使CSS--better(系列一)

    我们想一下以下问题: 1.什么样子的css代码才是高效的? 2.什么样子的css代码才是便于维护的? 3.什么样子的css才是可扩展的? 带着以下问题咱们简单的说一下css的“性能”问题 虽然我技术不 ...

  10. 初步认识Spring MVC框架

    Spring MVC 框架和Struts2等一样属于MVC框架,用于处理页面和后台的交互,据说它的效率要高于Struts2.下面县先说一下Spring MVC的结构,Spring MVC主要由Disp ...