726. 原子的数量

带括号的题一般都可以用栈来解决,比如(A(BC)2)3,处理完BC乘以2之后,到达后面的括号),不光A乘以3,BC也得乘以3。所以在栈里里面括号的信息,要更新在外面括号的信息。在栈里需要一个容器保存原子的个数。


class Solution(object):
    def countOfAtoms(self, formula):
        N = len(formula)
        stack = [collections.Counter()]
        i = 0
        while i < N:
            if formula[i] == '(':
                # 添加一个计数器  保存括号的信息
                stack.append(collections.Counter())
                i += 1
            elif formula[i] == ')':
                # 取出来当前()里的原子信息
                top = stack.pop()
                i += 1
                i_start = i
                # 找出数字
                while i < N and formula[i].isdigit(): i += 1
                multiplicity = int(formula[i_start: i] or 1)
                # 这条代码是关键
                # 内部的括号处理完  这些原子的个数的要更新到外面的括号里
                for name, v in top.items():
                    stack[-1][name] += v * multiplicity
            else:
                i_start = i
                i += 1
                # 找出原子
                while i < N and formula[i].islower(): i += 1
                name = formula[i_start: i]
                i_start = i
                # 找出数字
                while i < N and formula[i].isdigit(): i += 1
                multiplicity = int(formula[i_start: i] or 1)
                stack[-1][name] += multiplicity

        return "".join(name + (str(stack[-1][name]) if stack[-1][name] > 1 else '')
                       for name in sorted(stack[-1]))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值