您的位置:首页 > 其它

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
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: