leetcode刷题记录-856. 括号的分数

120 阅读2分钟

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

前言

今天的题目为中等,题目的难点在于分数的计算,要使用什么方式来计算当前的括号数量以及计算分数。

每日一题

今天的题目是 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

题解

首先这道题需要先去理解清除题目的意思,也就是分数的计算规则,分别是 () 一个完整的括号算是一分,两个括号并排在一起 ()() 算是相加也就是两分,以此类推。两个括号嵌套 (()) 算是里面的分数乘以2,也就是 1*2 ,当内部不只有一个括号的时候, 比方说 (()()) 那就是先计算内部是 1+1 为 2 然后在 乘以 2.

在理解了分数的计算规则,我们使用栈来解决这道题。

我们利用一个栈来保存当前的括号数量,当碰到 做括号的时候 ( 就像这个栈中添加入当前的分数值,当碰到右括号的时候,就计算当前拥有的分数并且将栈内的最后一个分数移除。

比方说 () 当碰到第一个括号的时候,我们向栈内存入 0,当碰到 第二个括号的时候,我们将栈内的最后一位取出,并且加上当前的分数,也就是1,分数的计算取决于有多少个连续的 ) 右括号,两个连续的右括号,代表了一定是需要乘以2的,因为一定存在着括号相互嵌套。

比如 ()() 碰到第三个左括号,就把当前的分数推入栈中,并且重置分数,碰到第四个右括号的时候,把当前的分数改为栈内的最后一个元素以及当前括号的叠加数量,也就是一个--一分,加起来就是两分。

综上就可以简单的完成这道题目。

function scoreOfParentheses(s: string): number {
    let point = 0;
    const stack = [];

    for (const ch of s) {
        if (ch === "(") {
            stack.push(point);
            point = 0;
        } else {
            let curPoint = point * 2 || 1
            point = stack.pop() + curPoint
        }
    }
    
    return point;
};

image.png