LeetCode 獨自升級紀 - [Stack] Valid Parentheses (Easy)

Posted by Young on 2025-08-15
Estimated Reading Time 2 Minutes
Words 635 In Total

題目

輸入一個只包含 ()[]{} 的字串,判斷它是否為「有效括號」。

input string 只有在以上狀況才視為 valid:

  1. 每個開括號都有對應的閉括號,且順序正確。
  2. 開括號與閉括號的類型必須相同。

Example:

1
2
3
4
5
s = "()"        # True
s = "()[]{}" # True
s = "(]" # False
s = "([)]" # False
s = "{[]}" # True

Stack

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def isValid(self, s: str) -> bool:
stack = []
close_bracket_key_hashmap = {")": "(", "]": "[", "}": "{"}

for c in s:
if c in close_bracket_key_hashmap: # 如果 c 在 closeToOpen 中,代表他就是 closing bracket,如果不在就先存到 stack,等之後可能遇到的右括號來配對
if stack and stack[-1] == close_bracket_key_hashmap[c]: # 如果 stack 內有東西,且 stack 最後一個元素是對應的 open bracket
stack.pop() # 如果是對的就把 stack 最後一個元素 pop 掉,
else:
return False # 如果第一個就是 closing bracket } 那就不用比了,因為順序一定錯誤,直接 return false
else:
stack.append(c) # (,if c in closeToOpen: 不成立,把 ( append 到 stack 內,那如果一開始遇到 closing bracket } 那就不用比了,因為順序一定錯誤
# print(stack) # ['(', '[', '{']
return True if not stack else False # 如果 stack 內沒有東西,代表全部都配對成功,回傳 True,否則回傳 False

大概的具體執行流程,用 pseudo code 解釋,以 input ([]) 為例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 第一個 c '(' 不在 close_bracket_key_hashmap 中,代表是 opening bracket,就直接把他 append 到 stack 中
if c in close_bracket_key_hashmap:
...

else:
stack.append()

# 此時的 stack = [ '(' ]

# 再來第二個 c '[' 也不在 close_bracket_key_hashmap 中,代表是 opening bracket,就直接把他 append 到 stack 中
# 此時的 stack = [ '(', '[' ]

# 再來第三個 c ')' 在 close_bracket_key_hashmap 中,代表是 closing bracket,接下來要檢查 stack 最後一個元素是否是對應的 opening bracket

# 如果 stack 不是空的,且最後一個 append 進 stack 的元素 [ == 對應的元素 [ 的話
if stack and stack[-1] == close_bracket_key_hashmap[c]:
stack.pop() # 就把最後一個元素 pop 掉
else:
return False # 如果不是對應的元素,就直接 return False

# 此時的 stack = [ '(' ]
...

# 重複以上流程,直到 s 的所有元素都被處理完

時間與空間複雜度:

  • TC:O(n)
  • SC:O(n)

Brute Force

1
2
3
4
5
6
class Solution:
def isValid(self, s: str) -> bool:
# Brute Force 判斷 s 是否為空字串
while "()" in s or "[]" in s or "{}" in s:
s = s.replace("()", "").replace("[]", "").replace("{}", "") # 刪除所有配對的括號
return s == ""

時間與空間複雜度:

  • TC:O(n^2)
  • SC:O(n)

若您覺得這篇文章對您有幫助,歡迎分享出去讓更多人看到⊂◉‿◉つ~


留言版