leetcode演算法之有效的括號(棧的知識)
阿新 • • 發佈:2018-12-16
博主最近重新又學習資料結構這門課程,現在學習到了棧的相關知識點,從棧的知識開始,我會在部落格中記錄相關的學習經驗以及重點,今天分享給大家一道有關棧的題目
題目描述:
給定一個只包括 '(',')','{','}','[',']' 的字串,判斷字串是否有效。 有效字串需滿足: 左括號必須用相同型別的右括號閉合。 左括號必須以正確的順序閉合。 注意空字串可被認為是有效字串。 示例 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(); } }