前往
大廳
主題

LeetCode - 856. Score of Parentheses 解題心得

Not In My Back Yard | 2022-11-14 12:00:18 | 巴幣 0 | 人氣 188

題目連結:


題目意譯:
給定一個平衡括號字串 s,回傳該字串的分數。

一個平衡括號字串之分數是基於以下規則計算:
"()" 有著 1 分。
AB 有著 A + B 分,其中 A 和 B 都是平衡括號字串。
(A) 有著 2 × A 分,其中 A 為一個平衡括號字串。

限制:
2 ≦ s.length ≦ 50
s 只由 '(' 和 ')' 所組成。
s 為一個平衡括號字串。



範例測資:
範例 1:
輸入: s = "()"
輸出: 1

範例 2:
輸入: s = "(())"
輸出: 2

範例 3:
輸入: s = "()()"
輸出: 2


解題思維:
跟括號匹配系列(如這題)的題目類似,我們需要一個堆疊來保存每個左括號的位置。而當遇到一個右括號時,將其與當前堆疊頂端的左括號配對(因此該堆疊將從頂端移除一個左括號),並將該左括號到右括號之間產生的分數值加總乘以 2 便是此配對的分數。

例如假設現在的左括號、右括號分別是 "(()(())())" 最左側以及最右側的括號(以紅色標注)。則可以看到中間有 "()" 、 "(())" 和 "()" 這三對括號,分數依序為 1 、 2 、 1,因此這個範例中整個字串的分數為 2 × (1 + 2 + 1) = 8 分。

此外,如果中間沒有夾著其他的括號(也就是沒有其他分數)時,則代表現在配對的括號是最內層的 "()"。因此其分數為 1 分。

而為了檢查中間有哪些分數,我們需要另一個堆疊來儲存分數,而每個分數值還需要額外記錄其出現的位置(可以使用其配對完成時的左括號為準),用來判斷哪些分數是位於當前配對的括號之間。

最後整個字串處理完後,儲存分數的堆疊可能有不少於一個元素(至少一個,因為 s 不是空字串),將它們加總即是所求。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作