[hot 栈] 856. 括号的分数

34 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

每日刷题 2022.10.09

题目

  • 给定一个平衡括号字符串 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\
  • 遇到) 计算当前闭合括号的分数+之前的括号的分数
  • 首先定义numsumnum作为结果记录,而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()
};