现在的位置: 首页 > 综合 > 正文

leetcode——Generate Parentheses

2017年12月22日 ⁄ 综合 ⁄ 共 1413字 ⁄ 字号 评论关闭

题目:

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:

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

思路: 

该题模拟栈的操作,但又跟栈的行为不太相同。对于括号,堆栈如果遇到“)”,一定会比对栈顶元素是不是“(”。如果是,则弹出栈顶;依次类推知道栈为空。

但是本题,并不需要弹出栈顶,而是需要记录顺序。因此,需要设计一个数据结构,能够保存它作为一个栈的动作的栈顶信息,如栈的size。同时需要记录左括号和右括号剩余数量。

我在模拟栈的时候选用了StringBuffer,可以高效的增加删除末尾的字符或字符串。同时,把加入右括号的过程当做堆栈的pop操作,对size进行更新(加入“)”的时候size-1)

使用递归操作,因为每一层都会有两种情况:加入左括号和加入右括号。则,当第一种执行完之后深入下一层,等待该路径上执行完之后回到该层,进行该层的第二种情况。

而递归就能很好的保存现场。

值得注意的地方:当size=0的时候,是不可以进行弹出,也就是不能append右括号了。因此当n=3时,第二层刚完成“(())”的时候,

是不能够执行第二种情况变成“(()))(”的。因为早在第二层刚完成(())的时候,size就已经为0了,在堆栈中,栈已经是空了 。因此该点需要注意。

当L为0的时候,就是堆栈只能弹出不能压入的时候,也就是该路线即将到达结尾的时候。此时,将所有的“)”append到StringBuffer中去,作为一种完整结果。

AC代码:

public class Generate_Parentheses {
    private List<String> rst = new LinkedList<String>();
    private StringBuffer sb = new StringBuffer("");
    private void generate(int L,int R,int size){
        if(L==0){
            for(;R>0;R--){
                sb.append(")");
                size--;
            }
            if(size==0){
                rst.add(sb.toString());
            }
        }
        else{
            int sbSize = sb.length();
            sb.append("(");
            generate(L-1,R,size+1);
            sb.delete(sbSize,sb.length());
            if (R>0 && size>0){
                sb.append(")");
                generate(L,R-1,size-1);
            }
        }
    }
    public List<String> generateParenthesis(int n) {
        if(n<=0)
            return rst;
        int L = n,R = n,size = 0;
        generate(L,R,size);
        return rst;
    }

    public static void main(String[] args){
        Generate_Parentheses generate_parentheses = new Generate_Parentheses();
        System.out.println(generate_parentheses.generateParenthesis(8));
    }
}

抱歉!评论已关闭.