好久没写博客,前几天和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; }