[LeetCode] 856. 括号的分数

规则:

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

给定一个平衡字符串求最后的分数:

思路:

这种括号类的题目使用栈的一般解法:左括号进栈,遇到右括号出栈

问题的关键是:如何在出栈的时候计算分数!

假设我们在括号匹配(遇到 )) 的时候计算分数。

我们不难发现一个性质,如果遇到 ) 出栈后

  • 栈是空的,则说明这对括号不在任何另外一对括号里面
  • 栈非空,说明这对括号在栈顶的括号内部,也就是上面说到的 (A) 情况

为了避免讨论,我们可以假设最外面还有一个大括号,所以只要在一对 () 完成匹配之后,栈顶的元素就是这对括号最相邻的外面的括号

知道了这个性质,我们就可以计算出 (A) 中 A 的值:只要 A 中括号匹配了之后就将其值加到外面的括号上去,最后 * 2 就是 (A) 的值。

这样的话问题就简化为了 (A) 这一种情况,如何求出 A 的值。

  • 如果 A 是 (B) 这种形式,就继续求 B,然后将 B 的分数加到外面括号上
  • 如果 A 是 BC... 这种形式,就是 B, C 的组合,B, C 在退栈之后栈顶就是外边的括号,直接将值加到栈顶就行。

栈里面存储的只是括号内的和,要 * 2 才是这个括号序列最终的值。

边界条件? A 为空:(),2 * 0 = 0,所以在遇到这种情况的时候要将其变为 1

具体流程:

  • 首先向栈里面 push(0) 代表最外面的一个虚拟括号,用来计算最后的值
  • 遍历
    • 遇到 ( push(0),代表当前括号内的值
    • 遇到 ) 如果当前括号内的值为 0 则值为1,否则值为 * 2,计算出值后,加到外围的括号上面

最后栈顶元素就是答案。

代码:

class Solution {
public:
    int scoreOfParentheses(string s) {
        stack<int> stk;
        stk.push(0);
        for (char ch : s) {
            if (ch == '(') {
                stk.push(0);
            } else {
                int v = stk.top();
                stk.pop();
                stk.top() += max(2*v, 1);
            }
        }
        return stk.top();

    }
};
posted @ 2022-10-09 21:03  沐灵_hh  阅读(31)  评论(0编辑  收藏  举报