1. 程式人生 > >leetcode演算法之有效的括號(棧的知識)

leetcode演算法之有效的括號(棧的知識)

博主最近重新又學習資料結構這門課程,現在學習到了棧的相關知識點,從棧的知識開始,我會在部落格中記錄相關的學習經驗以及重點,今天分享給大家一道有關棧的題目

題目描述:

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

有效字串需滿足:

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

示例 1:

輸入: "()"
輸出: true
示例 2:

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

輸入: "(]"
輸出: false
示例 4:

輸入: "([)]"
輸出: false
示例 5:

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

個人思考這道演算法思路;首先我們看到這種輸入輸出樣例,即可知道用棧的知識來解決,大致思路為:

左括號需要入棧,等到迴圈的值為右括號的時候,這個時候我們需要幹兩件事情:

1.此時可以發現棧內肯定只有左括號(如果為空,直接返回false即可,因為左括號都沒有,右括號無論如何都不可能匹配成功).那麼把棧頂的元素進行出棧

2.出棧的元素和此時的右括號進行比較,如果能夠組成一個完整的括號,證明成功,再進行迴圈,否則直接返回失敗

 

期間需要注意幾個小細節:
1.在進行出棧的時候,要檢查棧中是否為空,如果為空,證明這個字串沒有左括號,則直接返回失敗

2.使用者輸入的是字串,我們需要用charAt的方法轉換成字元

3.最後返回的時候要注意到檢查棧中內容是否為空,如果不為空,即使前面的匹配條件都滿足,也有可能出現多餘的括號沒有匹配到,

例如這樣的例子:"[{( )}"

參考答案程式碼:

import java.util.Stack;

class Solution {

    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for(int i=0;i<s.length();i++){
            char c = s.charAt(i);
            if(c == '{' || c== '(' || c== '['){
                stack.push(c);
            }
            else{
                if(stack.isEmpty()){
                    return false;
                }
                else{
                    if(c=='}' && stack.pop()!='{'){
                        return false;
                    }
                    if(c==']' && stack.pop()!='['){
                        return false;
                    }
                    if(c==')' && stack.pop()!='('){
                        return false;
                    }
                }
            }
        }
        return  stack.isEmpty();
    }

}