*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()); } } }

浙公网安备 33010602011771号