一魚多吃 用stack來驗證 合法括弧字串 678. Valid Parenthesis String

更新於 發佈於 閱讀時間約 4 分鐘
raw-image

題目敘述

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

配對規則

左括弧 ( 可以和 右括弧 ) 配對,其中 左括弧一定要在右括弧的左邊。

左括弧 ( 也可以和 *星號 配對,其中 左括弧一定要在*星號的左邊。

問我們給定的輸入字串s是否為合法括弧配對字串?

例如 s = "()(*" ,是合法括弧配對字串。

又例如s = "()*(" ,不是合法括弧配對字串。

詳細的題目敘述在這裡:


測試範例

Example 1:

Input: s = "()"
Output: true

Example 2:

Input: s = "(*)"
Output: true

Example 3:

Input: s = "(*))"
Output: true

約束條件

Constraints:

  • 1 <= s.length <= 100
  • s[i] is '('')' or '*'.

演算法

這題也可以用到前面學過的stack配對模型的模板來實作。

先建立兩個堆疊,第一個叫做stk,第二個叫做star

stk 用來記錄 左括弧( 的陣列索引位置

star用來記錄 *星號 的陣列索引位置

每次遇到左括號,就推入當下的索引

每次遇到右括號,則依序下列規則進行

  1. 假如stk非空,代表還有 左括弧( 可以配對,pop頂端元素。
  2. 假如star非空,代表還有 *星號 可以配對,pop頂端元素。
  3. 假如都沒有,代表當下的 右括號) 無法配對,直接return False,代表輸入為非法字串


接著,假如stk和star還有殘留,則依序檢查是否每個左括弧(都在對應*星號的左邊。
假如不是,代表殘留的左括弧(*星號無法配對,直接return False,代表輸入為非法字串


最後,全部配對完之後,檢查stk是否為空,代表全部配對完成。



程式碼

class Solution:
 def checkValidString(self, s: str) -> bool:
  
  # store the indices of '('
  stk = []
  
  # store the indices of '*'
  star = []
  
  
  for idx, char in enumerate(s):
   
   if char == '(':
    stk.append( idx )
    
   elif char == ')':
    
    if stk:
     stk.pop()
    elif star:
     star.pop()
    else:
     return False
   
   else:
    star.append( idx )
  
  
  # cancel ( and * with valid positions, i.e., '(' must be on the left hand side of '*'
  while stk and star:
   if stk[-1] > star[-1]:
    return False
  
   stk.pop()
   star.pop()
  
  
  # Accept when stack is empty, which means all braces are paired
  # Reject, otherwise.
  return len(stk) == 0
    

複雜度分析

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

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


關鍵知識點

在於理解並且活用stack 先進後出FILO的特質,來實作括號配對

記得回去複習 合法括號配對這題,主要的原理是相通的。


Reference:

[1] Python O(n) by stack. 85%+ [w/ Comment] - Valid Parenthesis String - LeetCode

avatar-img
91會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給我們一個輸入陣列,陣列裡面存放的是每個元素做XOR之後的前綴累積值。 要求我們從累積值還原出原本的陣列元素值。 XOR前綴累積值定義: pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i]
題目會給定一組規則,要求我們計算給定長度下的母音直線排列有幾種?
題目會給定一個存有整數的陣列,要求我們依照下列規則進行排序,由小排到大,升序排列。
題目會給定一個帶有Random Pointer的鏈結串列,要求我們實體複製deep copy這條鏈結串列,並且輸出副本的根結點。
題目給定一個規律變化的二進位字串,問我們第N排,第K個bit是多少? 變化的規律: 上一排的0到下一排展開成01,上一排的1到下一排展開成10 第一排初始化是0 第二排是01 第三排是0110 第四排是01101001 ...其餘依此類推 詳細的題目可在這裡看到
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
題目會給我們一個輸入陣列,陣列裡面存放的是每個元素做XOR之後的前綴累積值。 要求我們從累積值還原出原本的陣列元素值。 XOR前綴累積值定義: pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i]
題目會給定一組規則,要求我們計算給定長度下的母音直線排列有幾種?
題目會給定一個存有整數的陣列,要求我們依照下列規則進行排序,由小排到大,升序排列。
題目會給定一個帶有Random Pointer的鏈結串列,要求我們實體複製deep copy這條鏈結串列,並且輸出副本的根結點。
題目給定一個規律變化的二進位字串,問我們第N排,第K個bit是多少? 變化的規律: 上一排的0到下一排展開成01,上一排的1到下一排展開成10 第一排初始化是0 第二排是01 第三排是0110 第四排是01101001 ...其餘依此類推 詳細的題目可在這裡看到
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
2.0 上古漢語的特殊結構 2.1 若干問題的澄清 二 舉個例子,假設有這樣的一個合乎語法的字符串﹕ 已知的是「AB」屬 x 語構型,而「A」屬 y 語構型,那麼「B」顯然屬於語構型 y\x。 其次,語言學家薩皮爾對語法的一個觀察十分準確﹕所有語法都有遺漏。 由於我們的研究對象是
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 七 指派範疇是第一步, 第二步是設定推導規則。 推導規則的作用是對某一給定的表式63 進行判定,看它是否一個貫通的表式(或詞構)。就上述英語例句而言,我們只需一個簡單的單向通則 (general rule)﹕6
Thumbnail
1.0 從函數到函算語法 1.1 句子成份 本書關注的是句子成份的分析。 如前述,詞類和句子成份是兩個很不一樣的概念。 詞類的劃分屬歸類性的描述。我們先有一個給定的詞彙,然後劃分若干詞類,比如名詞﹑動詞﹑形容詞等,再進而對詞彙中的每一個詞進行分類,即說某詞屬名詞﹑某詞屬動詞﹑某詞可以是名
  ※對偶:   對偶是個很有詩意的孩子,非常適合強迫症使用。   嚴格的對偶是「上下句成雙成對,字數相等,詞性相同,有時候甚至講求平仄相對」。但一般來說,除了寫唐詩,平仄可以不用太在意。   對偶就是對稱的文句,平衡且對比,富含觀感上的美感。   對偶有四寶:「句中對」、「單句對」、「隔句
  嗯……這篇是類疊跟設問的場合。也是快變成國文課的場合。 ❈❈❈   ※類疊法:   接二連三地反覆使用相同的一個字詞、語句。可增加文章的節奏感,凸顯文章的重點。   讓句型更加生動,避免枯燥,任何詞性都可以被重疊。名詞重疊常表示數量龐大;動詞重疊表示動作的進行;形容詞或副詞的重疊表示委婉
Thumbnail
可選串聯(?.)運算符用於訪問 object 的屬性或調用函數。如果使用該運算符訪問的object 或調用的函式為 undefined 或 null,則表達式會回傳 undefined,而不是拋出錯誤。
Thumbnail
集錄一些小短篇句,有魚有肉,戲寫新年。 《說魚之樂》 莊子看的魚是什麼魚? 可能是路邊香燴魷魚。 一條魚兩條魚三條魚。 三條鬚四條鬚五條鬚。 你說牠是龍呢還是魚。 真是樂透了立即烹煮。
Thumbnail
一魚多吃 Linea + 銘文 + Particle Network,今天晚上按頭打 邀請: https://ally.build?inviteCode=AAE6J2 https://ally.build?inviteCode=QOCT15 https://ally.build?inviteC
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
2.0 上古漢語的特殊結構 2.1 若干問題的澄清 二 舉個例子,假設有這樣的一個合乎語法的字符串﹕ 已知的是「AB」屬 x 語構型,而「A」屬 y 語構型,那麼「B」顯然屬於語構型 y\x。 其次,語言學家薩皮爾對語法的一個觀察十分準確﹕所有語法都有遺漏。 由於我們的研究對象是
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 七 指派範疇是第一步, 第二步是設定推導規則。 推導規則的作用是對某一給定的表式63 進行判定,看它是否一個貫通的表式(或詞構)。就上述英語例句而言,我們只需一個簡單的單向通則 (general rule)﹕6
Thumbnail
1.0 從函數到函算語法 1.1 句子成份 本書關注的是句子成份的分析。 如前述,詞類和句子成份是兩個很不一樣的概念。 詞類的劃分屬歸類性的描述。我們先有一個給定的詞彙,然後劃分若干詞類,比如名詞﹑動詞﹑形容詞等,再進而對詞彙中的每一個詞進行分類,即說某詞屬名詞﹑某詞屬動詞﹑某詞可以是名
  ※對偶:   對偶是個很有詩意的孩子,非常適合強迫症使用。   嚴格的對偶是「上下句成雙成對,字數相等,詞性相同,有時候甚至講求平仄相對」。但一般來說,除了寫唐詩,平仄可以不用太在意。   對偶就是對稱的文句,平衡且對比,富含觀感上的美感。   對偶有四寶:「句中對」、「單句對」、「隔句
  嗯……這篇是類疊跟設問的場合。也是快變成國文課的場合。 ❈❈❈   ※類疊法:   接二連三地反覆使用相同的一個字詞、語句。可增加文章的節奏感,凸顯文章的重點。   讓句型更加生動,避免枯燥,任何詞性都可以被重疊。名詞重疊常表示數量龐大;動詞重疊表示動作的進行;形容詞或副詞的重疊表示委婉
Thumbnail
可選串聯(?.)運算符用於訪問 object 的屬性或調用函數。如果使用該運算符訪問的object 或調用的函式為 undefined 或 null,則表達式會回傳 undefined,而不是拋出錯誤。
Thumbnail
集錄一些小短篇句,有魚有肉,戲寫新年。 《說魚之樂》 莊子看的魚是什麼魚? 可能是路邊香燴魷魚。 一條魚兩條魚三條魚。 三條鬚四條鬚五條鬚。 你說牠是龍呢還是魚。 真是樂透了立即烹煮。
Thumbnail
一魚多吃 Linea + 銘文 + Particle Network,今天晚上按頭打 邀請: https://ally.build?inviteCode=AAE6J2 https://ally.build?inviteCode=QOCT15 https://ally.build?inviteC