LeetCode 856. Score of Parentheses
題目連結
LeetCode 856. Score of Parentheses
題目敘述
題目給定一個 Valid Parenthesis String(VPS)s,需要返回這個字串的分數。
計分方式:
()記為 1 分- 如果兩組
()位於同一層,則視為相加,例如()()記為 2 分 - 如果
()被包在內層,則記為2^(層數 - 1)分,例如(())記為2^(2-1)也就是 2 分
解題思路
這題真的是看懂題目要花半個小時,解題只需要十分鐘,也是看了留言區有人貼的圖才比較清楚題目到底想表達什麼,這裡附上作為參考: https://leetcode.com/problems/score-of-parentheses/description/comments/3571291/

這一題最重要的點在於,把一整包的 () 視為一個整體做計算,也就是說,我們在乎的只有層層堆疊之後,最裡面的 () 到底屬於第幾層,應該要算幾分,當最裡面的 () 已經被計算過後,外層就可以不用再計算分數。
所以我們可以透過一個 stack 來記錄目前的 ( 層數為多少,接著當我們遇到 ) 的時候,如果他的前一位是 ( 就表示它屬於當下的最內層,把分數記錄到總和之後就可以把層數 -1,繼續往後做計算。
解題步驟
- 宣告
depth、sum來記錄層數以及分數總和 - 遇到
(,層數 +1 - 遇到
)- 如果前一位是
(,分數總和加上2^(depth-1),接著depth-1 - 如果不是,就直接
depth-1
- 如果前一位是
JavaScript 實作
/**
* @param {string} s
* @return {number}
*/
var scoreOfParentheses = function (s) {
let depth = 0,
sum = 0
for (let i = 0; i < s.length; i++) {
if (s[i] === "(") {
depth++
} else {
if (s[i - 1] === "(") {
sum = sum + 2 ** (depth - 1)
}
depth--
}
}
return sum
}
複雜度
- 時間:
O(n) - 空間:
O(1)