描述

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. html实现网站全局按钮点击后置灰,不允许连续点击

    <script> document.addEventListener("mouseup", upHandler, true); function upHandler(e ...

  2. 解决scrollView中嵌套viewPager的冲突问题

    很简单,在外层ScrollView中添加android:fillViewport="true"属性,然后给viewPager添加一个固定高度

  3. 使用第三方工具Cornerstone搭建本地SVNserver

    一.加入版本号资源库 点击Cornerstone左下角REPOSITORIES栏右边的加号button.在弹出的视图中选择File Repository,然后选择Create a New Reposi ...

  4. dede后台title怎么修改的?去掉XXXX-织梦内容管理系统V5.7

    dede后台title怎么修改的? 去掉XXXX-织梦内容管理系统V5.7 打开include/common.inc.php的文件. $cfg_version = 'V57_UTF8_SP1';(这是 ...

  5. The Pilots Brothers' refrigerator - poj 2965

      Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20325   Accepted: 7830   Special Judg ...

  6. 调用http接口耗时过长。

    利用CRUL命令简单分析请求细节所占用的时间吧 curl -o /dev/null -s -w %{http_code}:%{time_namelookup}:%{time_redirect}:%{t ...

  7. windows 和 linux 上 循环读取文件名称的区别和方法

    function showGetFileName($type){ $url="/opt/mobile_system/gscdn"; //另一台服务器映射到linux过来的路径. # ...

  8. java后端技术

    技术概论:Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa j2ee分布式架构 我在恒生工作,主要开发金融互联网第三方平台的对接项目.目前已经对接 ...

  9. Java多线程编程总结一:多线程基本概念

    Java多线程编程总结一 – 初识多线程 进程.多进程.线程.多线程的概念 进程(process):CPU的执行路径.通俗的说就是系统中正在运行的程序.比如我们打开了浏览器.QQ等等,这些程序一旦被打 ...

  10. redis-windows和linux下安装

    Window 下安装 下载地址:https://github.com/dmajkic/redis/downloads. 下载到的Redis支持32bit和64bit.根据自己实际情况选择,将64bit ...