No.20, Valid Parentheses
No.22, Generate Parentheses
第一个题目主要是判断给定的括号序列是否合法(即成对),这里括号包含(){}[]。第二个题是生成n对括号组成的合法的序列,这里括号只是()。
第一题括号配对,这里括号的规律是:如果碰到了右括号,就需要看一下有没有配对的左括号。这里可以使用栈的方式实现,如果是左括号,则压栈,如果是右括号,则出栈,看是否弹出了配对的左括号。(这里的原理:({[]}),从中间[]开始消除,然后是{},最后是()),可以采用反证法证明,首先栈中不可能有右括号,因为只有左括号才会入栈,如果弹出的左括号和碰到的右括号不匹配,那么对于合法的括号序列来说,该右括号之前应该有一个和左括号配对的右括号,但是事实上没有。
public class Solution { public boolean isValid(String s) { Stack stack=new Stack(); for(int i=0;i<s.length();i++){ char c=s.charAt(i); if(c=='['||c=='{'||c=='('){ stack.push(c); } if(c==')') if(stack.isEmpty()||(char)stack.pop()!='(') return false; if(c=='}') if(stack.isEmpty()||(char)stack.pop()!='{') return false; if(c==']') if(stack.isEmpty()||(char)stack.pop()!='[') return false; } if(stack.isEmpty()){ return true; } else return false; } }
第二题,同样也是有一定规则的,例如生成时,如果当前左括号的数量小于等于右括号的数量,那么下一个肯定不可能是右括号;否则下一个可能是左括号也可能是右括号。
这里可以采用递归的方式求解,在每次递归时,如果剩余左括号,那么先增加左括号进行递归,如果剩余右括号且右括号的数量小于左括号,那么增加右括号递归。(都符合的话,两种都会进行递归)
public class Solution { public List<String> generateParenthesis(int n) { List<String> result=new ArrayList<String>(); generate(n,n,"",result); return result; } public void generate(int left,int right,String s,List<String> result){ if(left==0&&right==0){ result.add(s); } if(left>0){ generate(left-1,right,s+"(",result); } if(right>0&&left<right){ generate(left,right-1,s+")",result); } } }