經典演算法題-括號有效性判斷
阿新 • • 發佈:2020-12-26
來自LeetCode-20
給定一個只包括 '(',')','{','}','[',']'的字串,判斷字串是否有效。
有效字串需滿足:
左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意空字串可被認為是有效字串。
分析:判斷括號是否可以成對,建議使用棧進行判斷
我們對給定的字串 s 進行遍歷,當我們遇到一個左括號時,我們會期望在後續的遍歷中,有一個相同型別的右括號將其閉合。由於後遇到的左括號要先閉合,因此我們可以將這個左括號放入棧頂。
當我們遇到一個右括號時,我們需要將一個相同型別的左括號閉合。此時,我們可以取出棧頂的左括號並判斷它們是否是相同型別的括號。如果不是相同的型別,或者棧中並沒有左括號,那麼字串 ss 無效,返回 \text{False}False。為了快速判斷括號的型別,我們可以使用雜湊對映(HashMap)儲存每一種括號。雜湊對映的鍵為右括號,值為相同型別的左括號。
在遍歷結束後,如果棧中沒有左括號,說明我們將字串 ss 中的所有左括號閉合,返回 True,否則返回False。
class Solution: def isValid(self, s: str) -> bool: if len(s) % 2 == 1: return False #有效字串的長度一定為偶數,因此如果字串的長度為奇數,我們可以直接返回False,省去後續的遍歷判斷過程 pairs = { ")": "(", "]": "[","}": "{", } #用字典來把左右括號對應關係儲存 stack = list() for ch in s: if ch in pairs: if not stack or stack[-1] != pairs[ch]: return False stack.pop() else: stack.append(ch) returnnot stack #匹配完成,判斷stack是否為空。不為空則return false