1. 程式人生 > 其它 >【刷穿 LeetCode】20. 有效的括號(簡單)

【刷穿 LeetCode】20. 有效的括號(簡單)

技術標籤:LeetCode 題解演算法與資料結構刷穿 LeetCode字串演算法資料結構javaleetcode

題目描述

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

有效字串需滿足:

  1. 左括號必須用相同型別的右括號閉合。
  2. 左括號必須以正確的順序閉合。

注意空字串可被認為是有效字串。

示例 1:

輸入: "()"
輸出: true

示例 2:

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

示例 3:

輸入: "(]"
輸出: false

示例 4:

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

示例 5:

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

棧 + 雜湊表解法

這是道模擬題,同一型別的括號,一個右括號要對應一個左括號。

不難發現可以直接使用 來解決:

class Solution {
    HashMap<Character, Character> map = new HashMap<Character, Character>(){{
        put(']', '[');
        put('}', '{');
        put(')', '(');
    }};
    public boolean isValid
(String s) { Deque<Character> d = new ArrayDeque<>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c == '(' || c == '{' || c == '[') { d.addLast(c); } else { if (!d.isEmpty() &&
d.peekLast() == map.get(c)) { d.pollLast(); } else { return false; } } } return d.isEmpty(); } }
  • 時間複雜度:對字串 s 掃描一遍。複雜度為 O ( n ) O(n) O(n)

  • 空間複雜度:使用的雜湊表空間固定,不隨著樣本數量變大而變大。複雜度為 O ( 1 ) O(1) O(1)

注意:三葉使用了 Deque 雙端佇列來充當棧,而不是 Stack,這也是 JDK 推薦的做法。建議所有的 Java 同學都採用 Deque 作為棧。

不使用 Stack 的原因是 Stack 繼承自 Vector,擁有了動態陣列的所有公共 API,並不安全,而且 Stack 還犯了面向物件設計的錯誤:將組合關係當成了繼承關係。


棧 + ASCII 差值解法

我們也可以利用 "()""{}""[]" 的左右部分在 ASCII 值上比較接近的事實。

() 分別對應 -7 和 -8;[] 分別對應 43 和 45;{} 分別對應 75 和 77。

也就是同類型的左右括號,相差不超過 2 ,同時不同型別的左右括號,相差大於 2。

利用此特性,我們可以節省一個雜湊表:

class Solution {
    public boolean isValid(String s) {
        Deque<Integer> d = new ArrayDeque<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            int u = c - '0';
            if (c == '(' || c == '{' || c == '[') {
                d.addLast(u);
            } else {
                if (!d.isEmpty() && Math.abs(d.peekLast() - u) <= 2) {
                    d.pollLast();
                } else {
                    return false;
                }
            }
        }
        return d.isEmpty();
    }
}
  • 時間複雜度:對字串 s 掃描一遍。複雜度為 O ( n ) O(n) O(n)

  • 空間複雜度: O ( 1 ) O(1) O(1)


最後

這是我們「刷穿 LeetCode」系列文章的第 No.20 篇,系列開始於 2021/01/01,截止於起始日 LeetCode 上共有 1916 道題目,部分是有鎖題,我們將先將所有不帶鎖的題目刷完。

在這個系列文章裡面,除了講解解題思路以外,還會盡可能給出最為簡潔的程式碼。如果涉及通解還會相應的程式碼模板。

由於 LeetCode 的題目隨著周賽 & 雙週賽不斷增加,為了方便我們統計進度,我們將按照系列起始時的總題數作為分母,完成的題目作為分子,進行進度計算。當前進度為 20/1916

為了方便各位同學能夠電腦上進行除錯和提交程式碼,我建立了相關的倉庫:Github 地址 & Gitee 地址

在倉庫地址裡,你可以看到系列文章的題解連結、系列文章的相應程式碼、LeetCode 原題連結和一些其他的優選題解。

#演算法與資料結構

#LeetCode題解

#演算法面試

宮水三葉的刷題日記