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]))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章