1. 程式人生 > 實用技巧 >經典演算法題-括號有效性判斷

經典演算法題-括號有效性判斷

來自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) return
not stack #匹配完成,判斷stack是否為空。不為空則return false