leetcode_856 括号的分数

248 阅读1分钟

要求

给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:

  • () 得 1 分。
  • AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
  • (A) 得 2 * A 分,其中 A 是平衡括号字符串。

示例 1:

输入: "()"
输出: 1

示例 2:

输入: "(())"
输出: 2

示例 3:

输入: "()()"
输出: 2

示例 4:

输入: "(()(()))"
输出: 6

提示:

  • S 是平衡括号字符串,且只含有 ( 和 ) 。
  • 2 <= S.length <= 50

核心代码

class Solution:
    def scoreOfParentheses(self, s: str) -> int:
        stack = [0]
        for x in s:
            if x == "(":
                stack.append(0)
            else:
                v = stack.pop()
                stack[-1] += 1 if v == 0 else 2 * v
        return stack.pop()

image.png

解题思路:括号的问题可以用栈解决。题目中已经说明括号字符串是合法的,我们无需考虑别的。括号存在包含关系时内部分数乘以2,存在并列关系时分数相加。我们准备一个栈,栈里存储的是括号分数,从左到右遍历括号,每当遇到一个左括号,则把数字0压入栈中,每当遇到一个右括号,弹出栈顶元素,做以下处理:

  • 如果被弹出的栈顶元素是零,说明这个零是刚刚被压入栈中的,当前的右括号直接与其对应的左括号相邻,当前元素的分数记录为1
  • 如果被弹出栈顶的元素不是零,说明当前右括号与其对应的左括号隔着一些括号,这时弹出的栈顶元素需要乘以2

将计算得到的数字与栈顶元素相加,因为存在并列关系。