leetCode 20 :Valid Parentheses 有效括号

1.题意:

*   20.有效的括号  valid  Parentheses   括号匹配。
*   给定一个只包括" { ,},[ ],( ) "的字符串,判断字符串是否有效
*   括号必须以正确的顺序关闭,"( )"  和"{} ,(),[ ]"  是有效的但是
*   " ([)] " 不是。

2.解题思路:

  时间复杂度O(n) 空间复杂度O(n)

1.左括号压栈 ,遇到右括号 取出栈顶与右括号比较。是否相同。
最后栈为空。
栈顶元素反应的就是最近的需要匹配的元素,如果此时栈为空则不匹配。

3.代码1

import org.junit.Test;

import java.util.Stack;

/**
 * 解题思路:
 *  左括号压栈 ,遇到右括号 取出栈顶与右括号比较。是否相同。
 *  最后栈为空。
 *  栈顶元素反应的就是最近的需要匹配的元素。
 *
 *
 */

public class Solution20 {

    @Test
   public   void   test1(){

        System.out.println(isValid("{([])}"));//true
        System.out.println(isValid("{}}"));//false
        System.out.println(isValid("(((({{{}}}))))"));//   true
        System.out.println(isValid("()()()()("));// 奇数个  false
   }

    @Test
    public   void   test2(){

        System.out.println(isValidByJavaSatck_2("{([])}"));//true
        System.out.println(isValidByJavaSatck_2("{}}"));//false
        System.out.println(isValidByJavaSatck_2("(((({{{}}}))))"));//   true
        System.out.println(isValidByJavaSatck_2("()()()()("));// 奇数个  false
    }

  public   boolean  isValid(String  s){

     // 1.合法性判断
     if(s==null|| s.length()==0){
         return false;
     }
     //2.如果字符串长度不为偶数--- 说明有一个多余的。
      if(s.length()%2!=0){
          return   false;
      }

      IStack<Character>  arrayStack =new ArrayStack<>();
   //1. 遍历,如果是左括号压栈

      for (int i = 0; i <s.length() ; i++) {
           char   ch =s.charAt(i);
          if(ch=='{'||ch=='('||ch=='['){

           arrayStack.push(ch);

          }
          if(ch=='}'|| ch==']'|| ch==')'){//如果是左括号 就出栈
          if(arrayStack.isEmpty()){// 如果此时栈不为空说明不匹配
             return   false;
          }

          Character  chget= arrayStack.pop();

          if(( chget=='{'&& ch=='}'   )|| ( chget=='[' && ch==']'  )   || ( chget=='(' && ch==')'   )) {

             continue;
          }else{
              return   false;
          }

          }
      }

   return  true;//不能直接返回  true  应该要判断栈是否是否为空   return   isEmpty
  }
    /***
     *   使用  Stack
     *
     *
     *
     */
    public   boolean  isValidByJavaSatck(String  s){

        // 1.合法性判断
        if(s==null|| s.length()==0){
            return false;
        }
        //2.如果字符串长度不为偶数--- 说明有一个多余的。
        if(s.length()%2!=0){
            return   false;
        }

        Stack  <Character> stack =new Stack<>();
        //1. 遍历,如果是左括号压栈

        for (int i = 0; i <s.length() ; i++) {
            char   ch =s.charAt(i);
            if(ch=='{'||ch=='('||ch=='['){

                stack.push(ch);

            }
            if(ch=='}'|| ch==']'|| ch==')'){//如果是左括号 就出栈
                if(stack.isEmpty()){// 如果此时栈不为空说明不匹配
                    return   false;
                }

                Character  chget= stack.pop();

                if(( chget=='{'&& ch=='}'   )|| ( chget=='[' && ch==']'  )   || ( chget=='(' && ch==')'   )) {

                    continue;
                }else{
                    return   false;
                }

            }
        }
        return  true;

    }

    public   boolean  isValidByJavaSatck_2(String  s){

        // 1.合法性判断
        if(s==null|| s.length()==0){
            return false;
        }
        //2.如果字符串长度不为偶数--- 说明有一个多余的。
        if(s.length()%2!=0){
            return   false;
        }

        Stack  <Character> stack =new Stack<>();
        //1. 遍历,如果是左括号压栈

        for (int i = 0; i <s.length() ; i++) {
            char   ch =s.charAt(i);
            if(ch=='{'||ch=='('||ch=='['){

                stack.push(ch);

            }else{
               if(stack.isEmpty()){//栈为空
                   return  false ;
               }
                Character  chget= stack.pop();
                if(( chget=='{'&& ch!='}'   )|| ( chget=='[' && ch!=']'  )   || ( chget=='(' && ch!=')'   )) {
                {
                    return   false;
                }

            }

            }
        }
        return  stack.isEmpty();

    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值