1. 程式人生 > >leetcode的python實現 刷題筆記20:有效的括號

leetcode的python實現 刷題筆記20:有效的括號

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

有效字串需滿足:

  1. 左括號必須用相同型別的右括號閉合。
  2. 左括號必須以正確的順序閉合。

注意空字串可被認為是有效字串。

示例 1:

輸入: "()"
輸出: true

示例 2:

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

示例 3:

輸入: "(]"
輸出: false

示例 4:

輸入: "([)]"
輸出: false

示例 5:

輸入: "{[]}"
輸出: true
class Solution(object):
    def isValid(self, string):
        """
        :type s: str
        :rtype: bool
        """
        # 用資料結構表示棧的時候,可以採用陣列或者連結串列,陣列相對實現比較簡單
        # 定義一個空陣列做棧,通過append()和pop()以及len()方法來模仿入棧,出棧,棧的大小
        stack = []
        # 定義一個數組,用作查詢元素
        muban = ["()", "[]", "{}"]
        # 遍歷字串的每一個元素
        for i in range(0, len(string)):
            # 然後將每一個元素入棧
            stack.append(string[i])
            # 當遇到棧的大小超過2時,並且棧中最後兩個元素在用作查詢元素的模板中時,就彈出棧的最上面兩個元素
            if len(stack) >= 2 and stack[-2]+stack[-1] in muban:
                stack.pop()
                stack.pop()
        # 當for迴圈遍歷完之後,判斷此時棧中元素是否完全彈出,如果是就返回true
        return len(stack) == 0

sl = Solution()
st = sl.isValid('{[]}')
print(st)

總結:

1.思路是不斷地將字串的元素入棧,然後如果遇到了棧的大小大於2並且棧的最頂層兩個元素合在一起的字串符合用於查詢元素的模板中的任意元素,就彈出這兩個元素,否則就繼續入棧,直到所有的元素都被入棧。最後面通過判斷棧的大小是否為0來判斷是否符合題意。

2.用陣列來表示一個棧的時候,可以使用append()和pop()以及len()方法來模仿入棧,出棧,棧的大小。append()是將要新增的元素放到陣列的最後面,pop() 函式用於移除列表中的一個元素(預設最後一個元素),並且返回該元素的值。因此符合棧的結構和功能。

3.在python中可以使用in符號判斷指定的元素是否存在於列表和元組中,甚至是字典(Python 字典 in 操作符用於判斷鍵是否存在於字典中,如果鍵在字典dict裡返回true,否則返回false)。值得注意的是,在判斷列表和元組時有些許的不同,以下是一些實驗的結果。

>>> 't' in ['r,'t']
True
>>> 't' in ('r','t')
True

>>> 't' in ['t/c','r']
False
>>> 't' in ('t/c','r')
False

>>> 't' in ['tEST']
False
>>> 't' in ('tEST')
True

由這些結果,我們可以發現一個很神奇的現象,在元組只有一個元素的時候,python在使用in判斷的時候,只要元組中的元素有這個符合的字串即可。