Problem Statement
(Source) Given a string that contains only digits 0-9
and a target value, return all possibilities to add binary operators (not unary) +
, -
, or *
between the digits so they evaluate to the target value.
Examples:
"123", 6 -> ["1+2+3", "1*2*3"] "232", 8 -> ["2*3+2", "2+3*2"] "105", 5 -> ["1*0+5","10-5"] "00", 0 -> ["0+0", "0-0", "0*0"] "3456237490", 9191 -> []
Tags: Divide and Conquer
.
Solution 1 - Backtracking
# https://discuss.leetcode.com/topic/24523/java-standard-backtrace-ac-solutoin-short-and-clear
class Solution(object):
def addOperators(self, num, target):
"""
:type num: str
:type target: int
:rtype: List[str]
"""
res = []
self.helper(num, target, res, 0, 0, 0, '')
return res
def helper(self, num, target, res, start_index, left, to_mul, path):
if start_index == len(num):
if left == target:
res.append(path)
else:
for index in xrange(start_index, len(num)):
if num[start_index] == '0' and index != start_index:
break
cur = int(num[start_index : index + 1])
# If it is the first number, no operators will preceed it.
if start_index == 0:
self.helper(num, target, res, index+1, cur, cur, str(cur))
else:
# If use '+' at current step:
self.helper(num, target, res, index+1, left+cur, cur, path+'+'+str(cur))
# If use '-' at current step:
self.helper(num, target, res, index+1, left-cur, -cur, path+'-'+str(cur))
# If use '*' at current step:
self.helper(num, target, res, index+1, left-to_mul+to_mul*cur, to_mul*cur, path+'*'+str(cur))