Basic Calculator IV LeetCode solution in Python

1
# Runtime: 62 ms (Top 83.61%) | Memory: 14.1 MB (Top 62.30%)
2
class Term:
3
def __init__(
4
self, exp: Optional[str] = "", *, term: Optional[Mapping[str, int]] = {}
5
) -> None:
6
self.d = defaultdict(int, **term)
7
if re.match(r"^\-?\d+$", exp):
8
self.d[""] += int(exp)
9
elif exp:
10
self.d[exp] += 1
11

12
def __add__(self, other: "Term") -> "Term":
13
return self._pm(other, add=True)
14

15
def __mul__(self, other: "Term") -> "Term":
16
res = defaultdict(int)
17
for (l_var, l_coef), (r_var, r_coef) in product(
18
self.d.items(), other.d.items()
19
):
20
res["*".join(sorted(self._exp(l_var) + self._exp(r_var)))] += (
21
l_coef * r_coef
22
)
23
return Term(term=res)
24

25
def __sub__(self, other: "Term") -> "Term":
26
return self._pm(other, add=False)
27

28
def get(self) -> List[str]:
29
return [
30
str(coef) + "*" * bool(var) + var
31
for var, coef in sorted(
32
self.d.items(), key=lambda t: (-len(self._exp(t[0])), t[0])
33
)
34
if coef
35
]
36

37
def _exp(self, var: str) -> List[str]:
38
return list(filter(bool, var.split("*")))
39

40
def _pm(self, other: "Term", *, add: bool) -> "Term":
41
res = copy.copy(self.d)
42
for var, coef in other.d.items():
43
res[var] += coef * (-1) ** (1 - add)
44
return Term(term=res)
45

46

47
class Solution:
48
def basicCalculatorIV(
49
self, expression: str, evalvars: List[str], evalints: List[int]
50
) -> List[str]:
51
vals = dict(zip(evalvars, evalints))
52
return eval(
53
re.sub(
54
r"[a-z0-9]+",
55
lambda m: "Term('" + str(vals.get(m.group(), m.group())) + "')",
56
expression,
57
)
58
).get()

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0