LeetCode 856. 括号的分数

本文介绍了一种计算平衡括号字符串分数的方法,通过递归定义解析括号结构,使用栈来实现算法。遇到左括号入栈,右括号时判断栈顶元素进行相应操作,最终计算出字符串总分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

由于问题是递归定义的,所以可以很简单地用递归去解这个题。

用栈解决的话,如果遇到左括号,则入栈。如果遇到右括号,判断栈顶是不是右括号,如果是则说明是(),出栈并压数字1;否则说明是(A)型,将内部数字全部加起来再次入栈。最后栈内是各种数字,加起来就可以了。

class Solution {
public:
    int scoreOfParentheses(string S) {
        stack<string> s;
        for(char& i : S) {
            if(i == '(') {
                s.push("(");
            } else {
                if(!s.empty() && s.top() == "(") {
                    s.pop();
                    s.push("1");
                } else {
                    int sum = 0;
                    while(!s.empty() && s.top() != "(") {
                        sum += stoi(s.top());
                        s.pop();
                    }
                    if(!s.empty()) {
                        s.pop();
                    }
                    s.push(to_string(sum * 2));
                }
            }
        }
        int res = 0;
        while(!s.empty()) {
            res += stoi(s.top());
            s.pop();
        }
        return res;
    }
};

 

转载于:https://www.cnblogs.com/hlk09/p/9735283.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值