【刷穿 LeetCode】20. 有效的括號(簡單)
技術標籤:LeetCode 題解演算法與資料結構刷穿 LeetCode字串演算法資料結構javaleetcode
題目描述
給定一個只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字串,判斷字串是否有效。
有效字串需滿足:
- 左括號必須用相同型別的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
示例 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題解
#演算法面試