forked from kamyu104/LeetCode-Solutions
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathnumber-of-atoms.py
More file actions
28 lines (23 loc) · 790 Bytes
/
number-of-atoms.py
File metadata and controls
28 lines (23 loc) · 790 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Time: O(n)
# Space: O(n)
import collections
import re
class Solution(object):
def countOfAtoms(self, formula):
"""
:type formula: str
:rtype: str
"""
parse = re.findall(r"([A-Z][a-z]*)(\d*)|(\()|(\))(\d*)", formula)
stk = [collections.Counter()]
for name, m1, left_open, right_open, m2 in parse:
if name:
stk[-1][name] += int(m1 or 1)
if left_open:
stk.append(collections.Counter())
if right_open:
top = stk.pop()
for k, v in top.iteritems():
stk[-1][k] += v * int(m2 or 1)
return "".join(name + (str(stk[-1][name]) if stk[-1][name] > 1 else '') \
for name in sorted(stk[-1]))