解法
首先,假如每个数字只有一位,那么算法很简单,回溯,遍历每个缝隙的符号值(+\-\*
),遍历完毕之后看最后得到的表达式的值是不是target
接着,现在每个数字可以有1位以上,所以遍历的选择要多一个,就是除了"+"``"-"``"*"
之外,还有""
空串。
如果每到终点用eval
等函数重新计算时间很很慢,所以要动态地追踪表达式的值
- 如果只有
+
和-
,是很容易追溯的。 - 如果有
*
的话,可以这么算,除了表达式的值之外,可以再记录一个prev
,表示表达式最后一个数的值。
比如1+2
就是2
,1-2
就是-2
,1-2*3
就是-6
,这样就可以倒推回去。
最后表达式的值就变成,v-prev+prev*int(s[i])
。 - 现在来解决
""
空串,我们需要知道最后一个数字的值last
。
新prev = prev/last*(10*last+int(s[i]))
新v = v-prev+新prev
class Solution(object):
def addOperators(self, s, target):
"""
:type num: str
:type target: int
:rtype: List[str]
"""
n = len(s)
ans = []
if s == "":
return []
def solve(now, i, v, prev, last):
if i == n:
# if eval(now)!=v:
# print now,v
if v == target:
ans.append(now)
return
# add
solve(now + "+" + s[i], i + 1, v + int(s[i]), int(s[i]), int(s[i]))
# sub
solve(now + "-" + s[i], i + 1, v - int(s[i]), -int(s[i]), int(s[i]))
# multi
solve(now + "*" + s[i], i + 1, v - prev + prev * int(s[i]), prev * int(s[i]), int(s[i]))
# space
if last!=0:
solve(now + s[i], i + 1, v + 9 * prev + int(s[i])*prev/last, 10 * prev + int(s[i]) *prev/last, last*10+int(s[i]))
solve(s[0], 1, int(s[0]), int(s[0]), 1)
return ans