1. 程式人生 > 實用技巧 >力扣 - 20. 有效的括號

力扣 - 20. 有效的括號

目錄

題目

20. 有效的括號

思路(輔助棧)

  • 用棧後進先出(LIFO)將符號入棧
  • 再利用HashMap儲存符號對
  • 由於都是這些符號,所以對每一個符號進行判斷,如果左括號直接入棧,右括號再進行判斷是否符合

程式碼

class Solution {
    public boolean isValid(String s) {
        if (s.length() == 0) {
            return true;
        }

        Deque<Character> stack = new LinkedList<>();
        HashMap<Character, Character> symbolMap = new HashMap<>();
        symbolMap.put(')', '(');
        symbolMap.put('}', '{');
        symbolMap.put(']', '[');

        // 遍歷字串
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            // 字元為右半部分
            if (symbolMap.get(ch) != null) {
                // 如果棧是空,但是當前字元ch又是右半部分,則直接為false
                // 或者如果左右符號不匹配,也返回false
                if(stack.isEmpty() || stack.pop() != symbolMap.get(ch)) {
                    return false;
                }
            } else {
                // 左括號直接入棧
                stack.push(ch);
            }
        }
        
        // 棧stack為空說明括號有效,返回true
        return stack.isEmpty();
    }
}

複雜度分析

  • 時間複雜度:\(O(N)\),其中 N 為字串長度
  • 空間複雜度:\(O(N)\),其中 N 為字串長度