问题描述
给定一个由 '(' 和 ')' 组成的字符串,我们需要计算其结构的分数。分数的计算规则如下:
- 如果有一个空字符串或者一个孤立的右括号,则分数为 0。
- 对于一个由 '()' 组成的对,分数为 1。
- 对于一个由 '(X)' 组成的括号,其中 X 是一个分数,那么这个括号的分数为 2 * X,其中 X 是括号内分数的总和。
- 一个由 '(X+Y)' 组成的括号,其中 X 和 Y 是分数,那么这个括号的分数为 2 * max(X, Y)。
示例
示例 1: 输入: s = "()" 输出: 1
示例 2: 输入: s = "(())" 输出: 2 解释: 每一对括号的分数为 1,所以总分数为 1 + 1 = 2。
示例 3: 输入: s = "()()" 输出: 2 解释: 每一对括号的分数为 1,所以总分数为 1 + 1 = 2。
示例 4: 输入: s = "(()(()))" 输出: 6 解释: 这个分数由两部分组成,分别是 2 * (1) 和 2 * (2 * 1) = 2 和 4。所以总分数为 2 + 4 = 6。
解法一
解题思路:
使用栈来处理括号的匹配和分数的计算。
/** @lc app=leetcode.cn id=856 lang=javascript** [856] Score of Parentheses*/// @lc code=start
function scoreOfParentheses(s) {let stack = [];for (let char of s) {if (char === '(') {stack.push(0);} else {let score = stack.pop();if (stack.length === 0) {stack.push(0);} else {let prev = stack.pop();stack.push(prev + (score === 0 ? 0 : (score === 1 ? 2 : 2 * Math.max(prev, score)));}}}return stack.pop();
}
// @lc code=end