Stack堆疊應用題 合法括號配對字串 Leetcode #20_Valid Parentheses

更新於 2024/10/04閱讀時間約 3 分鐘
raw-image

這題的題目在這裡:

題目敘述

題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。

問我們給定的輸入字串s 是不是合法括弧配對字串,也就是所有的右括弧都在左括弧後面,而且可以兩兩相消。


測試範例

Example 1:

Input: s = "()"
Output: true

Example 2:

Input: s = "()[]{}"
Output: true

Example 3:

Input: s = "(]"
Output: false

約束條件

Constraints:

  • 1 <= s.length <= 104
  • s consists of parentheses only '()[]{}'.

演算法

使用字典建立左右括號的配對關係應設,和stack檢查配對括號的技巧。

底層資料結構使用stack,藉由FILO, First-in last-out的特性來協助判斷。

每遇到一個左括號就推入stack,

每遇到一個右括號,就檢查頂部是不是對應的左括號,假如是,就一起pop出來。假如不是,直接return False 代表不是合法配對字串。

最後都配對完,stack應該要為空(empty stack)。


程式碼

class Solution:
 def isValid(self, s: str) -> bool:
  
  stack = []
  
  # mapping relationship
  # key: right bracket
  # value: corresponding left bracket
  pair = {
     ')': '(',
     ']': '[',
     '}': '{'
    }
  
  
  left_bracket = set( pair.values() )
  top_index = -1
  
  for char in s:
   
   if char in left_bracket:
    # push left bracket into stack
    stack.append(char)  
   
   elif not stack or (stack[top_index] != pair[char]):
    # Cannot match if stack is empty, or corresponding right bracket does not exist
    return False
   
   else:
    # Match if we have corresponding right bracket on top layer of stack
    stack.pop()
    
  return len(stack) == 0

複雜度分析

時間複雜度: O( n )
從頭到尾,每個字元檢查過一遍。

空間複雜度: O( n )
需要一個stack,stack耗用空間最多和字串長度一樣長。


關鍵知識點

在於理解並且活用stack 先進後出FILO的特質,來實作括號配對
並且利用dictionary字典來儲存左右括號的配對映射關係


Reference:

[1] Python/Go/C++ O(n) by stack [w/ Comment] 有 中文詳解 解題影片 - Valid Parentheses - LeetCode


avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給定我們一個串列,和一個n值,要求我們刪除尾巴數來的第n個節點。 例如 1->2->3->4->5 和 給定n值=2,要求我們刪除尾巴數來的第2個節點。 尾巴數來的第2個節點是4,刪除之後,更新連結,輸出答案如下 1->2->3->5
題目會給定我們一個n值,問我們n! 也就是n階乘 尾巴的零有多少個? 例如n=5 就是代表5! = 5x4x3x2x1=120 尾巴有一個零,回傳1
題目會給定一組已經規定好的介面interface,要求我們實作HashSet這種資料結構。也就是一般數學和程式語言中所說的"集合"。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目會給定一組輸入陣列,裡面每個參數分別代表矩陣的寬和高。 如果有兩個矩陣的寬/高的比例是相同的,代表這兩個矩陣是等比例的。 要求我們計算,等比例的矩陣pair總共有多少個?
題目會給定我們一個輸入陣列,要求我們計算好配對的數目有多少個? 好配對的定義: 兩個數字相同,但是陣列索引一個在前,一個在後。 nums[i] == nums[j] and i < j. 這樣 (i, j) 就稱為一組好配對。
題目會給定我們一個串列,和一個n值,要求我們刪除尾巴數來的第n個節點。 例如 1->2->3->4->5 和 給定n值=2,要求我們刪除尾巴數來的第2個節點。 尾巴數來的第2個節點是4,刪除之後,更新連結,輸出答案如下 1->2->3->5
題目會給定我們一個n值,問我們n! 也就是n階乘 尾巴的零有多少個? 例如n=5 就是代表5! = 5x4x3x2x1=120 尾巴有一個零,回傳1
題目會給定一組已經規定好的介面interface,要求我們實作HashSet這種資料結構。也就是一般數學和程式語言中所說的"集合"。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目會給定一組輸入陣列,裡面每個參數分別代表矩陣的寬和高。 如果有兩個矩陣的寬/高的比例是相同的,代表這兩個矩陣是等比例的。 要求我們計算,等比例的矩陣pair總共有多少個?
題目會給定我們一個輸入陣列,要求我們計算好配對的數目有多少個? 好配對的定義: 兩個數字相同,但是陣列索引一個在前,一個在後。 nums[i] == nums[j] and i < j. 這樣 (i, j) 就稱為一組好配對。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
在之前的教學中,已經學會了用雙向鏈結串列來實作Stack 堆疊。 今天,要用另一種底層資列結構,python list,來實作Stack 堆疊。 讀者可以從中發現,因為python list的功能和function實作已經很豐富, 所以使用起來,相當直覺,也簡單許多。
Thumbnail
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Stack 堆疊。
Thumbnail
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s 是不是合法括弧自串,也就是所有的右括弧都在左括弧後面,而且可以兩兩相消。
Thumbnail
兩年前剛出社會的時候也寫過面試心得文:2021 社會新鮮人軟體工程師求職心得分享,不知不覺兩年就過了,自己也不再是這個圈子裡最年輕的那批人,在新手的光環慢慢消失後,職涯的考驗似乎才真的開始...
Thumbnail
每個method都有一個自己的stack Instance Variable 會存在heap中 Local Variable 會存在stack中
Thumbnail
📔心得 最近,我在探索 Ansible 自動化工具的過程中,決定運用它來建立 ELK Stack,這是我之前使用 Docker 建立的經驗的延伸。在這個過程中,我想分享一下我的學習心得。
Thumbnail
建置好前端後, MERN全端工程師教學在這裡 想學習MongoDB和Express可以來這裡學習
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
在之前的教學中,已經學會了用雙向鏈結串列來實作Stack 堆疊。 今天,要用另一種底層資列結構,python list,來實作Stack 堆疊。 讀者可以從中發現,因為python list的功能和function實作已經很豐富, 所以使用起來,相當直覺,也簡單許多。
Thumbnail
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Stack 堆疊。
Thumbnail
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s 是不是合法括弧自串,也就是所有的右括弧都在左括弧後面,而且可以兩兩相消。
Thumbnail
兩年前剛出社會的時候也寫過面試心得文:2021 社會新鮮人軟體工程師求職心得分享,不知不覺兩年就過了,自己也不再是這個圈子裡最年輕的那批人,在新手的光環慢慢消失後,職涯的考驗似乎才真的開始...
Thumbnail
每個method都有一個自己的stack Instance Variable 會存在heap中 Local Variable 會存在stack中
Thumbnail
📔心得 最近,我在探索 Ansible 自動化工具的過程中,決定運用它來建立 ELK Stack,這是我之前使用 Docker 建立的經驗的延伸。在這個過程中,我想分享一下我的學習心得。
Thumbnail
建置好前端後, MERN全端工程師教學在這裡 想學習MongoDB和Express可以來這裡學習