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