带括号的题一般都可以用栈来解决,比如(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]))