从leetcode—Generate Parentheses看卡特兰数
2016-04-06 10:11
513 查看
<span style="line-height: 27.7894744873047px; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; background-color: rgb(255, 255, 255);">Generate Parentheses</span>
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:
"((()))", "(()())", "(())()", "()(())", "()()()"
Subscribe to see which companies asked this question
仔细思考这个问题,打印所有正确的n对括号序列,所有合法序列在打印的时候由于括号是封闭的所以当你打印一个右括号的时候,前面必须有一个左括号与之对应,用更简单的方法表示if(left>right){you can print right ;right++}当然left《=n。
这和买票找零钱问题(一半人拿5元,一半人拿10元,票价如何排列可以顺利的售票),
站队问题(站两排,每排必须从高到矮,二排必须比对应的一排人高)。
都属于catalan(卡特兰数总感觉用英文高大上一点)问题:
Catalan数的定义令h(1)=1,Catalan数满足递归式:h(n) = h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1),n>=2该递推关系的解为:h(n) = C(2n-2,n-1)/n,n=1,2,3,...(其中C(2n-2,n-1)表示2n-2个中取n-1个的组合数)
现在回到这个问题上,他要求我们打印所有序列而不是简单的算可能性。若果把想成它想成一个出度为2的有向图,可以用深度搜索打印序列。代码如下:
class Solution { public: void generate(int re_left,int re_right,string s,vector<string> &answer) { if(re_left==0 && re_right==0) { answer.push_back(s); } if(re_left>0) { generate(re_left-1,re_right,s+'(',answer); } if(re_right>0 && re_right > re_left) { generate(re_left,re_right-1,s+')',answer); } } vector<string> generateParenthesis(int n) { vector<string> answer; string s =""; generate(n,n,s,answer); return answer; } };
相关文章推荐
- Action & Golf 四个魔法球实战训练系列_huatuo_新浪博客
- 【SPI】Polling Interrupt DMA
- 配置时间服务器
- 由文件描述符得到文件的全路径
- 在linux下部署java项目的准备
- 聊聊架构
- iOS 遇到的小知识点总结
- hash table
- UINavigationBar
- iOS之App加急审核详细步骤
- 为什么软件开发周期通常是预期的两三倍?
- FAT32文件系统的存储组织结构(一)
- Android提权漏洞CVE-2014-7920&CVE-2014-7921分析
- 标题栏显示进度条
- shell 处理文本工具集合(常用命令)
- 【Mybatis进阶】-- 原生态jdbc程序开发的短板
- Hugepages详情
- 简单的文件读写
- h5:记住这些足以胜任前端开发01
- Android开发必备应用