帶括號的題一般都可以用棧來解決,比如(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]))