leetcode 20. Valid Parentheses 棧 python3

一.問題描述

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. 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
                    
                   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章