LintCode刷题——生成括号

427-生成括号

题目:给定 n 对括号,请写一个函数以将其生成新的括号组合,并返回所有组合结果。

样例:给定 n = 3, 可生成的组合如下:"((()))", "(()())", "(())()", "()(())", "()()()"

算法:对于给定的n,定义一个result字符串,当字符串中的'('的数目大于')'的数目,则该字符串中可以拼接'('或')';

    否则,result中只能拼接'('。递归终止条件为左括号数目与n相同,此时只能在result中插入右括号。递归表达式为:

        T(i+1)  = T(i) + '('        当i<n时; 

           T(i+1) = T(i) + ')'   当i<n 且result中'('数多于')';                                 

代码:

public class Solution {
    /**
     * @param n n pairs
     * @return All combinations of well-formed parentheses
     */
    
    public void generateBracket(ArrayList<String> result, int n, int lBraNums, int rBraNums, String item ){
        if(lBraNums==n){
            for(int i=0;i<n-rBraNums;i++){
                item+=')';
            }
            result.add(item);
            return;
        }
        else{
            generateBracket(result,n,lBraNums+1,rBraNums,item+'(');
            if(lBraNums>rBraNums){
                generateBracket(result,n,lBraNums,rBraNums+1,item+')');
            }
        }
    } 
    
    public ArrayList<String> generateParenthesis(int n) {
        // Write your code here
        ArrayList<String> result = new ArrayList<String>();
        generateBracket(result,n,0,0,"");
        return result;
    }
}

算法复杂度:

        由于T(i)由T(i-1)的两种方式决定,故算法复杂度为O(2^n);

     T(i+1)  = 2T(i) + O(1) = 2(2T(i-1) + O(1) ) + O(1) = ....

  所以T = O(2^n);

 

posted @ 2017-09-15 23:23  Revenent  阅读(335)  评论(0编辑  收藏  举报