题目:
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)); } }