持续创作,加速成长!这是我参与「掘金日新计划 · 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()
};