Backtrack through all splits and operators. Track running value and last operand for multiplication.
Here's the solution:
function addOperators(num, target):
results = []
function backtrack(index, expr, val, prev):
if index == len(num):
if val == target:
results.append(expr)
return
for i in range(index, len(num)):
if i > index and num[index] == '0':
break
cur = int(num[index..i+1])
if index == 0:
backtrack(i+1, str(cur), cur, cur)
else:
backtrack(i+1, expr+"+"+str(cur), val+cur, cur)
backtrack(i+1, expr+"-"+str(cur), val-cur, -cur)
backtrack(i+1, expr+"*"+str(cur), val-prev+prev*cur, prev*cur)
backtrack(0, "", 0, 0)
return results
time, space for recursion where is the length of the string.