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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
| using System;
using System.Collections.Generic;
public class Expression
{
public long Value;
public override string ToString()
{
return Value.ToString();
}
}
public class BinaryExpression : Expression
{
public char Operator;
public Expression LeftChild;
public Expression RightChild;
public override string ToString()
{
return string.Format("{0}{1}{2}", LeftChild, Operator, RightChild);
}
}
public class Solution {
public IList<string> AddOperators(string num, int target) {
var results = new List<string>();
if (string.IsNullOrEmpty(num)) return results;
this.num = num;
this.results = new List<Expression>[num.Length, num.Length, 3];
foreach (var ex in Search(0, num.Length - 1, 0))
{
if (ex.Value == target)
{
results.Add(ex.ToString());
}
}
return results;
}
private string num;
private List<Expression>[,,] results;
private List<Expression> Search(int left, int right, int level)
{
if (results[left, right, level] != null)
{
return results[left, right, level];
}
var result = new List<Expression>();
if (level < 2)
{
for (var i = left + 1; i <= right; ++i)
{
List<Expression> leftResult, rightResult;
leftResult = Search(left, i - 1, level);
rightResult = Search(i, right, level + 1);
foreach (var l in leftResult)
{
foreach (var r in rightResult)
{
var newObjects = new List<Tuple<char, long>>();
if (level == 0)
{
newObjects.Add(Tuple.Create('+', l.Value + r.Value));
newObjects.Add(Tuple.Create('-', l.Value - r.Value));
}
else
{
newObjects.Add(Tuple.Create('*', l.Value * r.Value));
}
foreach (var newObject in newObjects)
{
result.Add(new BinaryExpression
{
Value = newObject.Item2,
Operator = newObject.Item1,
LeftChild = l,
RightChild = r
});
}
}
}
}
}
else
{
if (left == right || num[left] != '0')
{
long x = 0;
for (var i = left; i <= right; ++i)
{
x = x * 10 + num[i] - '0';
}
result.Add(new Expression
{
Value = x
});
}
}
if (level < 2)
{
result.AddRange(Search(left, right, level + 1));
}
return results[left, right, level] = result;
}
}
|