部分文章内容为公开资料查询整理,原文出处可能未标注,如有侵权,请联系我,谢谢。邮箱地址:gnivor@163.com ►►►需要气球么?请点击我吧!

*LeetCode--22. Generate Parentheses (补充输出所有出栈序列)

题目大意:给出n对圆括号,求出所有可能的括号匹配情况。例如:
n=3时,所有的匹配情况有:"((()))", "(()())", "(())()", "()(())", "()()()"

思路:类似于编程之美4.3 买票找零问题。在这任何位置上,左括号的数量都大于等于右括号的数量。根据这条规则,可以按照下面的方法设计程序:

假设共有n对括号,结果集为result,str用来保存当前结果
1. 若左括号和右括号的剩余数量都是0时,当前结果保存在结果集中。
2. 否则
2.1 若左括号有剩余,则将左括号加到当前结果,然后递归的计算左括号数量-1的情况
2.2 若右括号有剩余,且剩余数量大于左括号数量,则将右括号加到当前结果,然后递归的计算右括号数量-1的情况

详细解释可见:http://blog.csdn.net/yutianzuijin/article/details/13161721

代码:

public static List<String> generateParenthesis(int n) {
    List<String> result = new ArrayList();
    generate(result,new String(), n,n);
    return result;
}

public static void  generate(List<String> result,String str ,int leftnum, int rightnum){
    if(leftnum==0&&rightnum==0){ //当数量满足要求时
        result.add(str);
    }
    else{
        if(leftnum>0){//左括号数量不满足,可以随便添加
            generate(result,str+"(",leftnum-1,rightnum);
        }
        if(rightnum>0&&leftnum<rightnum){ //右括号数量不够,且左括号剩余数量少于右括号
            generate(result,str+")",leftnum,rightnum-1);
        }
    }
    
}

 

 

扩展:给定一个字符序列,求其所有的出栈序列。例如 入栈顺序为"asdf",求所有的出栈序列

思路:和上面的结构基本一样。

public static List<String> generateinputStack(String str) {
    List<String> result = new ArrayList<String>();
    Deque<String> q = new LinkedList<String>();
    Stack<String> stack = new Stack<String>();
    Deque<String> seq = new LinkedList<String>();
    int len = str.length();
    for(int i = 0 ; i < len ; i++){
        seq.add(str.substring(i, i+1));
    }
    
    inoutStack(result,q,stack,seq, len,len);
    return result;
    
}

//q表示结果集,stack临时栈,seq输入队列
public static void inoutStack(List<String> result ,Deque<String> q , Stack<String> stack, Deque<String> seq,int innum , int outnum){
    if(innum==0&&outnum==0){ //当数量满足要求时
        result.add(q.toString()); //保存结果
    }
    else{
        if(innum>0){//入栈数量不满足,可以随便添加    
            stack.push((String) seq.pollFirst());                
            inoutStack(result,q,stack,seq,innum-1,outnum); 
            seq.addFirst(stack.pop()); //处理完后需要将seq复原
        }
        if(outnum>0&&innum<outnum){ //出栈数量不足,剩余的入栈数<剩余的出栈数(即入栈数>出栈数)
            q.addLast(stack.pop()); 
            inoutStack(result,q,stack,seq,innum,outnum-1);
            stack.push(q.pollLast());
        }
    }
}

 

posted @ 2015-07-16 21:25  流了个火  阅读(636)  评论(0)    收藏  举报
►►►需要气球么?请点击我吧!►►►
View My Stats