1. 程式人生 > >11.有效的括號-Leetcode 020(python)

11.有效的括號-Leetcode 020(python)

  • 題目描述

給定一個只包括 '(',')','{','}','[',']' 的字串,判斷字串是否有效。

有效字串需滿足:

左括號必須用相同型別的右括號閉合。 左括號必須以正確的順序閉合。 注意空字串可被認為是有效字串。

  • 示例

示例 1:

輸入: "()" 輸出: true 示例 2:

輸入: "()[]{}" 輸出: true 示例 3:

輸入: "(]" 輸出: false

  • 解決方案

本想自己解決,但是用了一堆if else的判斷最後把自己都快搞瘋掉也不能AC,看了網上的解決方案,意識到自己的問題在於老想著用最笨的方法去遍歷記錄,對資料結構的理解、掌握和應用不到位,效率低,效果差。

參考的解決方案使用的思路是用棧的資料結構來解決,如果當前字元是左括號,則直接放入棧中,如果是右括號,那麼就判斷此時棧裡的字元是否是與之對應的左括號,如果不是的話則返回False,要注意如果此時棧是空的,也是返回False。

另外需要注意的是有可能會出現字串中只有左括號的情況,棧不為空,但是返回的是False。一開始做的時候沒有考慮到這個,報錯了。

  • 程式碼
class Solution:
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        
        l = len(s)
        if l ==0 :
            return True
        #如果字元個數為奇數,直接返回False
        elif l%2 ==1:
            return False
        
        d = {'(':')','[':']','{':'}'}
        #棧
        stack = []
        
        for i in s:
            #如果當前字元為左括號,則直接加入棧中
            if i in d:
                stack.append(i)
            #如果當前字元為右括號
            else:
                if not stack:
                    return False
                else:
                    #判斷當前棧中是否有與當前右括號相匹配的左括號
                    if d[stack.pop()] != i:
                        return False
                    
        #之所以判斷棧此時是否為空,是要考慮字串是'(('的情況
        if stack == []:
            return True
        else:
            return False