一.問題描述
Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
An input string is valid if:
- Open brackets must be closed by the same type of brackets.
- Open brackets must be closed in the correct order.
Note that an empty string is also considered valid.
Example 1:
Input: "()" Output: true
Example 2:
Input: "()[]{}" Output: true
Example 3:
Input: "(]" Output: false
Example 4:
Input: "([)]" Output: false
Example 5:
Input: "{[]}" Output: true
二.解題思路
括號,有點類似做一個計算器,讀入表達式輸出結果,不過顯然要比那個簡單一點。
實現方法就是用棧(先進後出)來處理。
對於我們知道,單單出現一個左括號,我們沒辦法做任何操作,因爲不知道後面會不會有該右括號,因此直接入棧。
出現一個右括號的時候,我們開始匹配,將上一個元素出棧(如果棧非空),判斷它是不是該右括號匹配的左括號,不是的話返回False。
可能有人會說爲啥直接判斷上一個元素和現在括號匹配就行了,之前的元素也有可能啊。比如說'(())'這種情況。
仔細思考,我們現在是碰到右括號就處理,因此如果是一個正確的括號匹配的字符串,至少在我當前要匹配的左右括號之間不存在右括號,因爲右括號已經被處理了。那麼,如果是一個正確的括號匹配的字符串,在我當前待處理的左右括號之間應該是沒有任何括號的(匹配的括號都已被彈出),因此如果上一個元素不是和現在的右括號匹配的左括號,那麼說明不是一個正確的括號匹配字符串。
注意:
1.如果一個字符串全部都是左括號,可能就不會進入到右括號處理程序(沒辦法判斷正確與否),此時只需要判斷棧是否空就好,如果是一個正確括號匹配字符串,處理完棧肯定爲空。
2.空字符串是True
時間複雜度:O(N),空間複雜度O(N)
更多leetcode算法題解法: 專欄 leetcode算法從零到結束 或者 leetcode 解題目錄 Python3 一步一步持續更新~
三.源碼
class Solution:
def isValid(self, s: str) -> bool:
prs_match={'}':'{',']':'[',')':'('}
stack,res=[],True
for ch in s:
if ch not in prs_match:stack.append(ch)
else:
if not stack or stack.pop()!=prs_match[ch]:
res=False
break
return res and not stack