-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathExpressionAddOperators.py
More file actions
31 lines (31 loc) · 1.09 KB
/
ExpressionAddOperators.py
File metadata and controls
31 lines (31 loc) · 1.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution(object):
def addOperators(self, num, target):
n = len(num)
def factor(s):
if len(s)==0: return ['']
n = 1 if s[0]=='0' else len(s)
r = []
for i in xrange(0,n):
op = '' if i+1 ==len(s) else '*'
r += [s[:i+1]+op+p for p in factor(s[i+1:])]
return r
def evaluate(s):
s = s.split('*')
return reduce(lambda y,x: int(x)*y, s, 1)
dp = {}
def dfs(i,target):
if i==-1:
return [''] if target==0 else []
if (i,target) in dp: return dp[i,target]
r = []
for j in xrange(i,-1,-1):
for f in factor(num[j:i+1]):
x = evaluate(f)
if j == 0:
r+=[f] if x==target else []
else:
r += [ p+"+"+f for p in dfs(j-1,target-x)]
r += [ p+'-'+f for p in dfs(j-1,target+x)]
dp[i,target] = r
return r
return dfs(n-1,target)