leetcode ---20. 有效的括號

給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判斷字符串是否有效。

有效字符串需滿足:

左括號必須用相同類型的右括號閉合。
左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。

示例1:

 輸入: "()"  
 輸出: true`

示例2:

 輸入: "()[]{}"
 輸出: true

示例3:

 輸入: "(]"
 輸出: false

示例4:

 輸入: "([)]"
 輸出: false

示例5:

 輸入: "{[]}"
 輸出: true

JAVA

思路:

①:( { } )

當( 入棧後,取下一個括號 { ,判斷當前括號是左還是右,如果爲左,則繼續入棧,反之爲右,匹配成功。

【注意】
右括號匹配之前,先檢測棧是否爲空,爲空:右括號比左括號多(返回false);非空:進行匹配,匹配成功出棧,匹配不成功返回false。

②:(

入棧後判斷棧是否爲空,爲空:匹配成功;非空:左括號比右括號多。

③:)

棧頂無左括號,右括號進行匹配時,要保證棧不能爲空。

④:( }

( 入棧,取下一個 } ,括號次序不匹配,返回false。

代碼如下:

class Solution {
    public boolean isValid(String s) {
       Stack<Character> ss = new Stack();
        for(int i = 0 ;i<s.length();i++){
            char c = s.charAt(i);

            //左括號入棧
            if(c =='(' || c=='{' || c=='['){
                ss.push(c);
            }
            //c是右括號
            //檢測是否爲空:空:右括號比左括號多(匹配不成功);非空:匹配成功
            else{
                if(ss.empty()){
                    return false;
                }
                //查看棧頂元素
                char cLeft=ss.peek();

                //檢測c的右括號與左括號(cLeft)匹配釋放
                if(cLeft == '(' && c == ')' ||
                        cLeft =='{' && c == '}' ||
                        cLeft =='[' && c == ']'){
                    ss.pop();//出棧
                }else{
                    //左括號次序匹配有問題
                    return false;
                }
            }
        }
        if(!ss.empty()){
            return false;
        }
       return true;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章