AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

LeetCode 856. Score of Parentheses    原题链接    中等

作者: 作者的头像   wzc1995 ,  2019-01-21 12:29:35 ,  所有人可见 ,  阅读 1568


3


题目描述

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

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

样例

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

注意

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

算法

(栈) $O(n)$
  1. 定义一个记录分数的栈,初始时放入 0 当做答案。
  2. 如果遇到左括号,则 0 入栈。
  3. 如果遇到右括号,则弹出栈顶;如果栈顶元素为 t = 0,则说明右括号是和上一个左括号相邻的,故此时的栈顶加 1;否则此时的栈顶加 2 * t。
  4. 最后栈中一定还剩一个元素,这个元素就是答案。

时间复杂度

  • 仅需要遍历所以字符一次,故时间复杂度为 $O(n)$。

空间复杂度

  • 需要额外的栈空间,故空间复杂度为 $O(n)$。

C++ 代码

class Solution {
public:
    int scoreOfParentheses(string S) {
        stack<int> score;
        score.push(0);
        for (auto &c : S) {
            if (c == '(')
                score.push(0);
            else {
                int t = score.top();
                score.pop();
                if (t == 0)
                    score.top() += 1;
                else
                    score.top() += 2 * t;
            }
        }
        return score.top();
    }
};

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息