Generate Parentheses 生成括号-- LintCode题解
2016-04-29 23:39
337 查看
越往后就越难,加油。
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
Have you met this question in a real interview?
Yes
Example
Given
set is:
然后,没有思路。
下面引用,谢谢。
这道题其实是关于卡特兰数的,如果只是要输出结果有多少组,那么直接用卡特兰数的公式就可以。关于卡特兰数,请参见卡特兰数-维基百科,里面有些常见的例子,这个概念还是比较重要的,因为很多问题的原型其实都是卡特兰数,大家可以看看。特别是其中
这个递推式的定义,很多这类问题都可以归结成这个表达式。这个题对于C的定义就是第一对括号中包含有几组括号。因为第一组括号中包含的括号对数量都不同,所以不会重复,接下来就是一个递归定义,里面又可以继续用更小的C去求组合可能性。
说完卡特兰数的内容,我们来看看这个具体问题怎么解决。一般来说是用递归的方法,因为可以归结为子问题去操作。在每次递归函数中记录左括号和右括号的剩余数量,然后有两种选择,一个是放一个左括号,另一种是放一个右括号。当然有一些否定条件,比如剩余的右括号不能比左括号少,或者左括号右括号数量都要大于0。正常结束条件是左右括号数量都为0。算法的复杂度是O(结果的数量),因为卡特兰数并不是一个多项式量级的数字,所以算法也不是多项式复杂度的。代码如下:
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
Have you met this question in a real interview?
Yes
Example
Given
n = 3, a solution
set is:
"((()))", "(()())", "(())()", "()(())", "()()()"
然后,没有思路。
下面引用,谢谢。
这道题其实是关于卡特兰数的,如果只是要输出结果有多少组,那么直接用卡特兰数的公式就可以。关于卡特兰数,请参见卡特兰数-维基百科,里面有些常见的例子,这个概念还是比较重要的,因为很多问题的原型其实都是卡特兰数,大家可以看看。特别是其中
这个递推式的定义,很多这类问题都可以归结成这个表达式。这个题对于C的定义就是第一对括号中包含有几组括号。因为第一组括号中包含的括号对数量都不同,所以不会重复,接下来就是一个递归定义,里面又可以继续用更小的C去求组合可能性。
说完卡特兰数的内容,我们来看看这个具体问题怎么解决。一般来说是用递归的方法,因为可以归结为子问题去操作。在每次递归函数中记录左括号和右括号的剩余数量,然后有两种选择,一个是放一个左括号,另一种是放一个右括号。当然有一些否定条件,比如剩余的右括号不能比左括号少,或者左括号右括号数量都要大于0。正常结束条件是左右括号数量都为0。算法的复杂度是O(结果的数量),因为卡特兰数并不是一个多项式量级的数字,所以算法也不是多项式复杂度的。代码如下:
import java.util.ArrayList; /** * Created by Administrator on 2016/4/29. */ public class GenerateParentheses { public static void main(String[] args) { int n = 3; ArrayList<String> arrayList = generateParenthesis(n); for (String s : arrayList) { System.out.print(s + ","); } } public static ArrayList<String> generateParenthesis(int n) { ArrayList<String> ans = new ArrayList<String>(); if (n == 0) return ans; String s = new String(); helper(n, n, s, ans); return ans; } /*** * r为右括号个数,l为左括号个数 * @param l * @param r * @param s * @param res */ public static void helper(int l, int r, String s, ArrayList<String> res) { if (r < l) return; if (l == 0 && r == 0) { res.add(s); } if (l > 0) helper(l - 1, r, s + "(", res); if (r > 0) helper(l, r - 1, s + ")", res); } }
相关文章推荐
- Spring JDBC常用方法详细示例
- POJ-2533 Longest Ordered Subsequence ( DP )
- 机器学习矩阵求导
- NYOJ吝啬的国度(搜索)
- opacity属性的应用
- Junit中Parametorized runner 的用法
- Image Classification: Data-driven Approach, k-Nearest Neighbor, train/val/test splits
- node.js之this的困惑
- (35)Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
- POJ 3101 素数分解+大数
- 【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
- HTML页面内块级元素内折行显示
- binary-tree-preorder-traversal(二叉树的前序遍历)
- Leetcode #59. Spiral Matrix ii 螺旋遍历2 解题报告
- linux下配置opencv
- sublime 添加ejs,less,stylus高亮
- 数据库之应用理论
- 爬虫小实验
- 如何在asp.net mvc3中使用HttpStatusCode
- 使用Hexo建立个人博客