Generate Parentheses

好久没写博客,前几天和Cindy_niu 聊了一下,发现自己确实懒惰了,刚好她那里很多题目,我也抄一份来做做,本来想从第一篇开始更起,但是看到文章很多,十天半个月追不上最新版,还是倒叙吧~

题目:点击打开链接

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:

"((()))", "(()())", "(())()", "()(())", "()()()"

重新整理一下,题目的要求是给出n值,算出全部可能的排列,并列出来,

n<0 无效

n=0时 组合为空

n=1时 () 组合数P为1,这里我们规定组合数为可列出的总数

n=2时 最外面的两个括号是( ~ ) 中间可以是(),也可以是)( 组合数P为2

.....

n=k时 假设 有组合数为 P 其中,输出解决方案 SolutionK[P];

n=k+1时 最外面两个括号必然是(~),分情况讨论

1、如果第二个括号是(,那么倒数第二个必然是),这就是n=k的情况

2、如果第二个是),倒数第二个必然是( ,那么去头去尾,这就是n=k-1的情况

此时,Solution(K+1)[P]就是“(”+SolutionK[P]+“)”和“()”+Solution(K-1)[P]+“()”的数组合并了,复制过来,加头加尾就行了


java递归实现

public String[] GenParenttheses(int n)throws UnsupportedOperationException{
	if(n<=0)throw new UnsupportedOperationException("unsupport exception");
	if( n == 1){
		String[] res=new String[] {"()"};
		return res;
	}else{
		String[] p= {"()" , ")("};
		String[] res =Gen(p,n-1);
		for(int i=0;i<res.length;i++){
			res[i] = left + res[i]+ right;  
		}
		return res;
	}
}

private static String left = "(";
private static String right =")";

private String[] Gen(String[] p,int n){
	if(n >1){
		p = Gen(p,n-1);
		String[] np = new String[2*p.length];
		for(int i=0;i<p.length;i++){
			np[2*i] = left+p[i]+right;
			np[2*i+1] = right+p[i]+left;
		}
		return np;
	}
	return p;
}





你可能感兴趣的:(LeetCode)