持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
每日刷题 2022.10.09
- leetcode原题链接:leetcode.cn/problems/sc…
- 难度:中等
题目
- 给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
- () 得 1 分。
- AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
- (A) 得 2 * A 分,其中 A 是平衡括号字符串。
示例
- 示例1
输入: "()"
输出: 1
- 示例2
输入: "(())"
输出: 2
- 示例3
输入: "()()"
输出: 2
- 示例4
输入: "(()(()))"
输出: 6
提示
S
是平衡括号字符串,且只含有(
和)
。2 <= S.length <= 50
解题思路
- 借助栈计算,每个字符串
s
看作是"" + s\
- 遇到
(
压入一个空字符串的分数0\
- 遇到
)
计算当前闭合括号的分数+
之前的括号的分数 - 首先定义
num
和sum
,num
作为结果记录,而sum
记录每一组括号的分数。 - 开一个
tmp
布尔值作为是否将sum
加入num
中的标志,因为当遇到)
的时候,我们只需要将当前的sum
加入一次即可,因为sum
记录就是用(
作为标准的,因此只需要加一次。 - 用
k
作为当前括号层数记录,以0
为分界点,每当k = 0
,就代表将记录下一组括号的分数。 - 遍历字符串,如果是
(
,那么我们需要判断k
是否为0
, 从而确认当前sum
的值。如果k != 0
,那么将sum *= 2
,也就是进2
,否则sum
置零。 - 如果是
)
,那么我们需要在第一次,即tmp = true
的时候将sum
的值记录到num
中,需要注意的是,无论tmp
如何,只要遇到)
,我们就需要将sum
的值除以2
,也就是退2
,同时k--
。
AC
代码
/**
* @param {string} s
* @return {number}
*/
var scoreOfParentheses = function(s) {
// 将所有的值都累加到栈顶的元素上
let stack = [0];// 初始化最终的结果
for(const ss of s) {
if(ss === '(') stack.push(0);
else {
// 当前的值已经计算完成,需要累积到最终的结果中
let cur = stack.pop();
stack.push(stack.pop() + Math.max(cur * 2 , 1));
}
}
return stack.pop()
};