Here is the implementation:
function diffWaysToCompute(expression):
results = []
for i from 0 to expression.length - 1:
c = expression[i]
if c in ['+', '-', '*']:
left = diffWaysToCompute(expression[0..i-1])
right = diffWaysToCompute(expression[i+1..])
for l in left:
for r in right:
if c == '+': results.append(l + r)
if c == '-': results.append(l - r)
if c == '*': results.append(l * r)
if results is empty:
results.append(parseInt(expression))
return results
Add memoization for repeated subexpressions to optimize. Time complexity is Catalan-like.