# [856] 括号的分数
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
() 得 1 分。
AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
(A) 得 2 * A 分,其中 A 是平衡括号字符串。
示例 1:
输入: "()"
输出: 1
示例 2:
输入: "(())"
输出: 2
示例 3:
输入: "()()"
输出: 2
示例 4:
输入: "(()(()))"
输出: 6
提示:
S 是平衡括号字符串,且只含有 ( 和 ) 。
2 <= S.length <= 50
涉及到括号匹配的题一般采用栈来解是比较合适的。
这道题中我们可以遍历字符串,若遇到左括号,则把之前的计算结果压入栈,并重置当前计数。遇到右括号时,就能算出与之匹配的括号内整体的分数了。
这里分两种情况:若res = 0,则说明上一个符号就是左括号,那么根据规则1,取temp值为1;若res不为0,则说明之前已经有右括号更新了res了,此时应该匹配规则3,取temp值为res * 2。再根据规则2,更新当前计算结果为栈顶值 + temp。
由于字符串最后一个字符一定是右括号,那么遍历结束时,整体得分就已经存在了res中了,因此直接返回res即可。
var scoreOfParentheses = function(S) {
let res = 0;
const stack = [];
for (let ele of S) {
if (ele === '(') {
stack.push(res);
res = 0;
} else {
const temp = res === 0 ? 1 : res * 2;
res = stack.pop() + temp;
}
}
return res;
};