class Solution:
def diffWaysToCompute(self, expression: str) -> List[int]:
"""tc O()???
main idea: devide & conquer + memoization
1. each time encounter a operator, devide into left and right part, do recursion to get a list of integer,
2. iterate through left and right make new substring with different priority that brought from parathesis
3. early termination: (1) when substring has only digit, return number (2) when substring exist in memo, return
"""
memo = {}
def dfs(s,memo):
if s in memo:
return memo[s]
if s.isdigit():
# update memo since its not seen
memo[s] = [int(s)]
return [int(s)]
res = []
for i,c in enumerate(s):
if c in ['+','-','*']:
left = dfs(s[:i],memo) # return a list of integer???
right = dfs(s[i+1:],memo)
for l in left:
for r in right:
if c == '+':
res.append(l+r)
elif c == '-':
res.append(l-r)
else: # c==*
res.append(l*r)
memo[s] = res
return res
return dfs(expression,memo)