力扣 726. 原子的数量 栈+map

54 篇文章 0 订阅
36 篇文章 0 订阅
本文介绍了如何使用递归和哈希表解决LeetCode问题Number of Atoms,通过自动解析原子和数字,实现括号序列中各原子出现次数的高效统计。算法利用栈结构跟踪原子计数,并确保结果按字典序排序。
摘要由CSDN通过智能技术生成

https://leetcode-cn.com/problems/number-of-atoms/
在这里插入图片描述
思路:对于括号序列问题,一般都可以用递归或者来求解。两种解法本质上都是对给定序列进行分层,即遇到左括号进入更深的一层,遇到右括号退出当前层。考虑到每一层中要统计每一个原子出现的次数,我们可以用哈希表来计数,但是结果要求按照字典序排序,因此可以使用 m a p map map计数,这样可以省去最后的排序步骤。那么如何在给定序列中解析出原子对应的字符串呢?以大写字母开头,后面跟一串小写字母。解析数字比较简单,直接看代码就能看懂。

class Solution {
public:
    string countOfAtoms(string formula) {

        int curidx=0,n=formula.size();

        auto parseAtom=[&]()->string
        {
            string ans;
            ans+=formula[curidx++];
            while(curidx<n&&islower(formula[curidx]))
                ans+=formula[curidx++];
            return ans;
        };

        auto parseNum=[&]()->int
        {
            int ans=0;
            while(curidx<n&&isdigit(formula[curidx]))
                ans=ans*10+formula[curidx++]-'0';
            return max(ans,1);
        };

        stack<map<string,int>> stk;
        stk.emplace();
        while(curidx<n)
        {
            if(formula[curidx]=='(')
            {
                stk.emplace();
                ++curidx;
            }
            else if(formula[curidx]==')')
            {
                map<string,int> cnt=move(stk.top());
                stk.pop();
                ++curidx;
                int num=parseNum();
                for(auto& pr:cnt)
                    stk.top()[pr.first]+=pr.second*num;
            }
            else
            {
                string atom=move(parseAtom());
                int num=parseNum();
                stk.top()[atom]+=num;
            }
        }
        string ans;
        for(auto& pr:stk.top())
        {
            ans+=pr.first;
            if(pr.second>1)
                ans+=to_string(pr.second);
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值