[Leetcode]Valid Parentheses&Generate Parentheses随记

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

 

posted @ 2016-03-02 16:17  上官筱儿  阅读(151)  评论(0编辑  收藏  举报