LeetCode | 20 Valid Parentheses / 堆疊 (Stack)

閱讀時間約 5 分鐘

記錄這一題的原因,在於透過這題可以學到經典資料結構之一 — 堆疊 (stack)

題幹要求是這樣的:

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

所以什麼是滿足題目的合格字串呢?

  1. 左括號要有匹配的右括號,如:( )[ ]{ }。
  2. 左括號必須以正確的順序關閉,比如 ({ )} 就是以不正確順序閉合的字串,但是如果是 ({ }) 就是合格的字串。

要分別滿足這兩個條件,其實可以寫兩個 for 迴圈分別來解決:

function isValid(s: string): boolean {
// 三種情況: '{}', '{[]}', '{}[]'
const open = ['(', '[', '{']
const close = [')', ']', '}']

// 評斷用的數字
let count = 0
let count2 = 0

// 當陣列元素只有一個直接為 false
s.length < 2 && false
// 處理 '{[]}' 的情況
for(let i = 0; i < s.length/2; i++){
const index = open.indexOf(s[i])
if(s[s.length - i -1] === close[index]){
count += 1
}
}
// 處理 '{}[]' 的情況
for(let i = 0; i < s.length; i += 2){
const index = open.indexOf(s[i])
if(s[i + 1] === close[index]){
count2 += 1
}
}

// 評估
if(count === s.length/2 || count2 === s.length/2){
return true
}else{
return false
}
};

但是!這是錯的答案,在第 79 個測試 "(([]){})" 中,上面的程式會給出 false 的答案,但預期其實是 true,這就是因為少考慮了綜合第一個與第二個條件的第三條件。

但其實這題的邏輯只要按下面這個思維想,可以發現其實考慮得不用像上面的程式碼那麼複雜:

  1. 遇到左括號,預期會有一個匹配的右括號。
  2. 遇到第二個左括號,要預期當第二個左括號有閉合的右括號後再往後找匹配第一個左括號的右括號。

就是這個第二點,細細品,他這個 "後遇到,先匹配" 的情況是不是跟資料結構之一的堆疊那 "後進先出" 的理念很像呢?

堆疊的概念

堆疊的概念

上圖就是堆疊 LIFO (Last In First Out) 的概念,新存進的資料必須先取出。

現在來把這題結合堆疊的概念來解:

function isValid(s: string): boolean {
const pairs = { '(': ')', '[': ']', '{': '}' }
let stack: string[] = []

if(s.length < 2){
return false
}

for(let i of s){
if(i in pairs){
stack.push(i)
}else{
let lastOpen = stack.pop()
if(pairs[lastOpen] !== i){
return false
}
}
}

return stack.length === 0
};

上面的關鍵點在於 for 迴圈和裡面的 if-else 判別式。當遍歷字串時遇到左括號時就把它推入堆疊中 (if 區塊中做的事);當遇到右括號時 (else 區塊中做的事),就把最新存到堆疊裡的左括號取出來做比對,如果比對錯誤就直接給出 false 回傳。最後,如果堆疊的長度為 0,就表示所有左括號都成功得到匹配,所以返回 true

LeetCode 之路,任重而道遠啊!

18會員
37Content count
這個專題用來存放我在學習網頁開發時的心得及知識。
留言0
查看全部
發表第一個留言支持創作者!
Jeremy Ho的沙龍 的其他內容
SQL語法:JOIN 與交易
SQL 基本篇 - CRUD、運算子、內建函式
MySQL 應用到 URL Shortener 上
LeetCode 518. Coin Challenge II / 動態規劃
SQL語法:JOIN 與交易
SQL 基本篇 - CRUD、運算子、內建函式
MySQL 應用到 URL Shortener 上
LeetCode 518. Coin Challenge II / 動態規劃
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
這題的題目在這裡:Find Pivot Index 題目敘述 題目會給我們一個整數陣列nums,要求我們計算平衡軸心點在哪? 平衡軸心的意思就是軸心點索引左側的元素總合 = 軸心點索引右側的元素總合
Thumbnail
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s 是不是合法括弧自串,也就是所有的右括弧都在左括弧後面,而且可以兩兩相消。
Thumbnail
題目會給定我們一個輸入陣列,裡面的字母A和字母B分別代表兩種顏色的卡片。 假如某張卡片的左右都是相同的,例如AAA,Alice可以抽掉中間那張A。 同樣的,假如某張卡片的左右都是相同的,例如BBB,Bob可以抽掉中間那張B。 請問Alice和Bob輪流玩抽卡遊戲, 請問最後是誰贏?
Thumbnail
進階圖論題目: 計算最短的一筆畫路徑長 題目會給定我們一張圖和對應的相鄰矩陣,要求我們返回一筆畫拜訪所有節點的最短路徑長,起終點不拘。
Thumbnail
Leetcode上正好有14天的讀書計畫,今天三題都是二分搜索,順手三題都寫一寫,想法上很固定。
Thumbnail
前幾天看別人直播刷題,心血來潮打開很久沒動的leetcode試試,挑了一題當初面試沒寫出來的題目。嗯...我那時才剛碰資料結構,知道要用stack寫卻沒實作過任何東西,現在有工作經驗後再來寫,看看會不會有不一樣的想法。
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
這題的題目在這裡:Find Pivot Index 題目敘述 題目會給我們一個整數陣列nums,要求我們計算平衡軸心點在哪? 平衡軸心的意思就是軸心點索引左側的元素總合 = 軸心點索引右側的元素總合
Thumbnail
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s 是不是合法括弧自串,也就是所有的右括弧都在左括弧後面,而且可以兩兩相消。
Thumbnail
題目會給定我們一個輸入陣列,裡面的字母A和字母B分別代表兩種顏色的卡片。 假如某張卡片的左右都是相同的,例如AAA,Alice可以抽掉中間那張A。 同樣的,假如某張卡片的左右都是相同的,例如BBB,Bob可以抽掉中間那張B。 請問Alice和Bob輪流玩抽卡遊戲, 請問最後是誰贏?
Thumbnail
進階圖論題目: 計算最短的一筆畫路徑長 題目會給定我們一張圖和對應的相鄰矩陣,要求我們返回一筆畫拜訪所有節點的最短路徑長,起終點不拘。
Thumbnail
Leetcode上正好有14天的讀書計畫,今天三題都是二分搜索,順手三題都寫一寫,想法上很固定。
Thumbnail
前幾天看別人直播刷題,心血來潮打開很久沒動的leetcode試試,挑了一題當初面試沒寫出來的題目。嗯...我那時才剛碰資料結構,知道要用stack寫卻沒實作過任何東西,現在有工作經驗後再來寫,看看會不會有不一樣的想法。