每日力扣-括号的分数

128 阅读2分钟

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

每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。

题目(已做删减处理)

给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:() 得 1 分。AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。(A) 得 2 * A 分,其中 A 是平衡括号字符串。

分析

一道简单的堆栈算法题目,没有什么特别需要注意的,我们只要能够辨别出题目涉及到的知识点,然后按照题目中的要求进行处理即可。因此,我们可以这么思考:

  1. 这是一道堆栈算法题,所以我们先定义一个栈用来存放结果。
  2. 栈的最开始肯定是0,因为没有任何数据进入。
  3. 开始处理整个字符串,当遇到 ( 时,我们需要存入占位0,遇到)时就出栈,用来获取栈顶元素。此时有两种情况:
  • 当 栈顶元素值为0时,则意味着) 的前一个元素是(,那么此时符合题目中的第一种情况,即(),记做分数为1;
  • 当 栈顶元素不为0时,则意味着)的前一个元素不是(,中间相隔了其他的字符,此时符合第二种情况,即(A),记做分数为A2。 依次执行上述的判断,也就意味着每次的每次遍历,都能够获取到对应的分数,将其进行求和计算。那么久能得到最后的结果。

总结

算是一道很经典的堆栈算法题。其实这道题目的解法很简单。但是之所以力扣给的middle的难度,我觉得最主要的还是题目的理解上。这道题目的规则说的比较模糊,在示例中也并没有说明如何进行计算。如果你没有搞懂题目的规则,那么解答起来就特别麻烦。

解题证明

image.png