合縱連橫: 從 括弧配對 理解 配對模型與Stack應用

閱讀時間約 10 分鐘

這篇文章,會帶著大家複習以前學過的配對模型與Stack框架

並且以括弧配對的應用題與概念為核心,

貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。


首先,Stack本身具有Last-In First-Out 後進先出的特質。

再根據題目所需要的資訊利用Stack去儲存索引、字串,
進行括弧配對相關的檢查或者計算。


常見的配對模型的Stack框架

stack, TOP = [], -1

for symbol in input:

if stack[TOP] is matched( ... ):
# 做某些配對需要的計算或檢查
​ # 把把配對成功的()pop出來

if allowed( ... )
# 如果符合題意,推入新的symbol進入stack頂端


return 最終結果(True/False,或者最後配對成功的字串)

配對模型常用的用途

1.檢查輸入字串是否為合法配對。
2.計算合法配對的長度。
3.生成合法配對的字串。

接下來,我們會用這個上面這種框架,貫穿一些同類型,有關聯的題目
(請讀者、或觀眾留意上面的這種 前綴和 框架,之後的解說會反覆出現)

有些題目剛好以前有錄過教學影片,提供給讀者參考。


Valid Parentheses 檢查是否為合法配對字串

這算是一個很常見的入門基本題。

想法也很直覺,就是遇到左(就推入,遇到)括號就pop出對應的左(

如果最後檢查完,stack剛好是空的,代表輸入字串是一個合法配對。


依照配對模型+stack框架拓展的解題程式碼

class Solution:
def isValid(self, s: str) -> bool:

stack = []

## dictionary
# key: right bracket
# value: corresponding left bracket
pair = {
')':'(',
']':'[',
'}':'{',
}

for char in s:

if char in pair:
# check when we meet right parenthesis

if (not stack) or ( stack and (stack[-1] != pair[char]) ):

# parenthesis mismatch
return False

else:

# parenthesis match
stack.pop()

else:
# push left parenthesis into stack
stack.append( char )


# Accept if all parenthesis pair are matched.
return not stack


Removing Stars From a String 從字串中移除*號

根據題意,
可以知道*其實是在模擬鍵盤上的backsapce鍵,相當於往左邊吃掉一個字元

轉換到配對模型,就相當於,把*星號和前面最接近的字元做配對,並且pop出來

最後留在stack內的字元,串接轉換成字串,就是最終移除*號的結果。


依照配對模型+stack框架拓展的解題程式碼,相當簡潔!

class Solution:
def removeStars(self, s: str) -> str:

stk = []

for char in s:

if char != '*':
stk.append( char )

else:
stk.pop()

return "".join(stk)

Longest Valid Parentheses 合法配對的最長長度


前面的題目,已經會檢查了,那如果要計算合法配對的最長長度也是類似的。

遇到(括號或者stack已經為空時,推入當下的索引。

遇到)括號就pop (括號出來,並且計算、更新合法配對的最長長度。


這邊有一個實作的細節需要留意,為了處理stack為空的狀態,
我們會事先在stack推入-1來代表stack為空,已經到達最底部,沒有東西了。


依照配對模型+stack框架拓展的解題程式碼

class Solution:
def longestValidParentheses(self, s: str) -> int:

# stack, used to record index of parenthesis
# initialized to -1 as dummy head for valid parentheses length computation
stack = [-1]

max_length = 0

# linear scan each index and character in input string s
for cur_idx, char in enumerate(s):

if char == '(':

# push when current char is (
stack.append( cur_idx )

else:

# pop when current char is )
stack.pop()

if not stack:

# stack is empty, push current index into stack
stack.append( cur_idx )
else:
# stack is non-empty, update maximal valid parentheses length
max_length = max(max_length, cur_idx - stack[-1])

return max_length

Generate Parentheses 生成指定長度的合法配對


剛剛已經會檢查、計算合法配對長度了。

那如果是要求我們從無到有生成指定長度的合法配對呢?

其實也是類似的,只是過程反過來而已

一開始從空字串出發,每回合依序在尾巴加上( 或者 )

如果到某一回合,發現( 和 ) 的數目相等,而且等於n,

代表已經製造出一個合法括號配對字串,加入到最終結果裡面。


依照配對模型+stack框架拓展的解題程式碼

class Solution:
def generateParenthesis(self, n):

# storage of final result
result = []

# content, left brace count, right brace count
stack = [("", 0, 0)]

while stack:
x, l, r = stack.pop()

if l - r < 0 or l > n or r > n:
# Skip invalid cases
continue

if l == n and r == n:
# Valid pair, add into final result
result.append(x)

# add one more left brace
stack.append((x+"(", l+1, r))

# add one more right brace
stack.append((x+")", l, r+1))

return result

結語

好,今天一口氣介紹了最精華的部分,

通用的配對模型+Stack框架,還有相關的合法配對的檢查、長度計算、與字串生成
應用題與演算法建造,


希望能幫助讀者、觀眾徹底理解它的原理,

並且能夠舉一反三,洞察其背後的本質和了解相關的應用領域!


感謝收看囉! 我們下篇文章再見~

85會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
這篇文章,會帶著大家複習以前學過的DFS框架, 並且以圖論的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 DFS 深度優先搜索框架 def dfs( parameter ): # 邊界條件 if base case or stop cond
這篇文章,會帶著大家複習以前學過的BFS框架, 並且以圖論的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 BFS 框架 + 演算法 虛擬碼 # Queue 通常初始化成根結點,作為起點 BFS_queue = deque([root])​ # 先
這篇文章,會帶著大家複習以前學過的格子點DP框架, 並且以移動路徑Unique Path的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 格子點DP框架 依循題目的定義和規則,找出格子點移動的共同模式。 以本篇文章的例題為例,每一步可以選擇往右走一個
這篇文章,會帶著大家複習以前學過的DFS框架 結合樹型DP, 並且以路徑和Path Sum的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 DFS 深度優先搜索框架 def dfs( parameter ): if base case or sto
這篇文章,會帶著大家複習以前學過的滑動窗口(Sliding window)框架, 並且滿足特定區間的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 滑動窗口(Sliding window)框架示意圖 滑動窗口(Sliding window)的框架
這篇文章,會帶著大家複習以前學過的前綴和框架, 並且以區間和的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 前綴和 prefix sum框架 與 區間和計算的關係式 接下來,我們會用這個上面這種框架,貫穿一些同類型,有關聯的題目 (請讀者、或觀眾
這篇文章,會帶著大家複習以前學過的DFS框架, 並且以圖論的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 DFS 深度優先搜索框架 def dfs( parameter ): # 邊界條件 if base case or stop cond
這篇文章,會帶著大家複習以前學過的BFS框架, 並且以圖論的應用題與概念為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 BFS 框架 + 演算法 虛擬碼 # Queue 通常初始化成根結點,作為起點 BFS_queue = deque([root])​ # 先
這篇文章,會帶著大家複習以前學過的格子點DP框架, 並且以移動路徑Unique Path的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 格子點DP框架 依循題目的定義和規則,找出格子點移動的共同模式。 以本篇文章的例題為例,每一步可以選擇往右走一個
這篇文章,會帶著大家複習以前學過的DFS框架 結合樹型DP, 並且以路徑和Path Sum的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 DFS 深度優先搜索框架 def dfs( parameter ): if base case or sto
這篇文章,會帶著大家複習以前學過的滑動窗口(Sliding window)框架, 並且滿足特定區間的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 滑動窗口(Sliding window)框架示意圖 滑動窗口(Sliding window)的框架
這篇文章,會帶著大家複習以前學過的前綴和框架, 並且以區間和的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 前綴和 prefix sum框架 與 區間和計算的關係式 接下來,我們會用這個上面這種框架,貫穿一些同類型,有關聯的題目 (請讀者、或觀眾
你可能也想看
Google News 追蹤
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
先進性血管性傷口是一種複雜的慢性傷口,需要多學科團隊合作的綜合治療。及早發現、進行詳細血管評估和適當的藥物和手術治療對改善患者的生存率和生活質素至關重要。我們需要提高對這個問題的認知,建立完善的護理標準,加強教育宣傳,以減輕這類傷口帶來的醫療負擔。
Thumbnail
連載 戰國縱橫門派:鬼谷稗闔 -- 蘇秦篇 : 全球各地的華人在追本溯源的文化底蘊中只能透過春秋戰國的百家思想遠遠的觀望人生所追求的答案,找尋失落已久的獨立自主意識和自由思想。但認清自己真實的一面是不容易的,能看明白世間一切問題的解決能力更不容易。
Thumbnail
藍白合破局後,各黨也陸續公布其總統候選人副手。而國民黨侯友宜與趙少康組成的「侯康配」民調卻讓人難以信服,看看兼任中廣董事長以及總經理的趙少康,再看看國民黨水漲船高的民調,引起外界質疑民調淪為政媒操作下的產物。
Thumbnail
2023年4月5日至8日,❙法國❙ 總統 ❙馬克龍❙ 對 ❙中華人民共和國❙ 進行國事訪問,期間有關應該避免陷入 ❙中美❙ 在 ❙台灣❙ 問題上的對抗的言論在西方政界引起軒然大波。 準確地說,❙馬克龍❙ 的 ❙歐洲❙「戰略自主」論調並非在國事訪問期間發表的,而是在國事訪問後,在飛回 —— 途經廣州
Thumbnail
話說商鞅被車裂後,秦惠王恨他歸恨他,但卻很理智,商鞅的一系列方針政策繼續沿用。 因為他發現商鞅打造的這臺國家機器太好用了,短短二十年的時間,秦國從被看不起的西戎小國到被周天子官方封為西部大總管,這種感覺太美妙了。 一碼歸一碼的處理方法,顯示出了秦惠王的政治水平。 政治,是一種需要極高理性的遊戲,還是
Thumbnail
在台北市中心街弄中有許多藝術機構,這些藝術機構不論是畫廊、美術館、藝術教室、藝文空間、博物館等多種形式存在。從這些藝術機構更扮演著社會大眾與藝術接觸機會。長流美術館算是台灣藝術機構之先進機構,憑藉著長流機構背景讓藝術深入社會大眾心中。 長流美術館相關資訊:: 地址: 台北市大安區仁愛路二段63號B1
Thumbnail
時隔多年,看到網飛(Netflix)將這部電影購入旗下著實是一種驚喜! 一個外貌看似九歲其實實際年齡早已三十有餘的偽蘿莉處心積慮機關算盡搶奪當家女主人大位的奮鬥史(無誤),我先把孤兒怨劇情的主體告訴各位,因為這部片的梗其實不難猜而且也不新鮮,比較讓我覺得有趣的是孤兒怨除了有鮮血、屍體、嚇人橋段之外,
Thumbnail
《NBA 2K20》發售以來應該不少玩家發現了一個奇妙的現象,許多充滿權威性的評分媒體都給予了中高以上的分數,但玩家這頭卻連 1 分都捨不得給。當然,我們無法得知或是去揣測那些給高分媒體是不是真的覺得遊戲好玩,至少在玩家們一致性的評論中,可以得知這款遊戲確實出了某種問題。
Thumbnail
歷史記載,所謂「合縱」又稱「合從」也就是聯合幾個較弱的國家對抗強大的秦國,巧合的是 alliance ㄧ字竟然也可能「alliance = a.ll.i.an.ce = 合.人人.以.anti.cina = 合.从.以.反.秦 = 合.從.以.反.秦 = 合從以反秦 = 合縱以反秦」或 ......
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
先進性血管性傷口是一種複雜的慢性傷口,需要多學科團隊合作的綜合治療。及早發現、進行詳細血管評估和適當的藥物和手術治療對改善患者的生存率和生活質素至關重要。我們需要提高對這個問題的認知,建立完善的護理標準,加強教育宣傳,以減輕這類傷口帶來的醫療負擔。
Thumbnail
連載 戰國縱橫門派:鬼谷稗闔 -- 蘇秦篇 : 全球各地的華人在追本溯源的文化底蘊中只能透過春秋戰國的百家思想遠遠的觀望人生所追求的答案,找尋失落已久的獨立自主意識和自由思想。但認清自己真實的一面是不容易的,能看明白世間一切問題的解決能力更不容易。
Thumbnail
藍白合破局後,各黨也陸續公布其總統候選人副手。而國民黨侯友宜與趙少康組成的「侯康配」民調卻讓人難以信服,看看兼任中廣董事長以及總經理的趙少康,再看看國民黨水漲船高的民調,引起外界質疑民調淪為政媒操作下的產物。
Thumbnail
2023年4月5日至8日,❙法國❙ 總統 ❙馬克龍❙ 對 ❙中華人民共和國❙ 進行國事訪問,期間有關應該避免陷入 ❙中美❙ 在 ❙台灣❙ 問題上的對抗的言論在西方政界引起軒然大波。 準確地說,❙馬克龍❙ 的 ❙歐洲❙「戰略自主」論調並非在國事訪問期間發表的,而是在國事訪問後,在飛回 —— 途經廣州
Thumbnail
話說商鞅被車裂後,秦惠王恨他歸恨他,但卻很理智,商鞅的一系列方針政策繼續沿用。 因為他發現商鞅打造的這臺國家機器太好用了,短短二十年的時間,秦國從被看不起的西戎小國到被周天子官方封為西部大總管,這種感覺太美妙了。 一碼歸一碼的處理方法,顯示出了秦惠王的政治水平。 政治,是一種需要極高理性的遊戲,還是
Thumbnail
在台北市中心街弄中有許多藝術機構,這些藝術機構不論是畫廊、美術館、藝術教室、藝文空間、博物館等多種形式存在。從這些藝術機構更扮演著社會大眾與藝術接觸機會。長流美術館算是台灣藝術機構之先進機構,憑藉著長流機構背景讓藝術深入社會大眾心中。 長流美術館相關資訊:: 地址: 台北市大安區仁愛路二段63號B1
Thumbnail
時隔多年,看到網飛(Netflix)將這部電影購入旗下著實是一種驚喜! 一個外貌看似九歲其實實際年齡早已三十有餘的偽蘿莉處心積慮機關算盡搶奪當家女主人大位的奮鬥史(無誤),我先把孤兒怨劇情的主體告訴各位,因為這部片的梗其實不難猜而且也不新鮮,比較讓我覺得有趣的是孤兒怨除了有鮮血、屍體、嚇人橋段之外,
Thumbnail
《NBA 2K20》發售以來應該不少玩家發現了一個奇妙的現象,許多充滿權威性的評分媒體都給予了中高以上的分數,但玩家這頭卻連 1 分都捨不得給。當然,我們無法得知或是去揣測那些給高分媒體是不是真的覺得遊戲好玩,至少在玩家們一致性的評論中,可以得知這款遊戲確實出了某種問題。
Thumbnail
歷史記載,所謂「合縱」又稱「合從」也就是聯合幾個較弱的國家對抗強大的秦國,巧合的是 alliance ㄧ字竟然也可能「alliance = a.ll.i.an.ce = 合.人人.以.anti.cina = 合.从.以.反.秦 = 合.從.以.反.秦 = 合從以反秦 = 合縱以反秦」或 ......