282. Expression Add Operators
刷
July-10-2019
高级DFS+剪枝
难的地方在于如何处理乘法,比较巧妙的办法是把这一层运算的值也传下去。
1 + 2 * 3 ,把2的数量传入下面,如果是*这种高级运算,就先reset上一层的结果,先-刚才加上的2,再算3,传下去的是2 * 3这样。
然后,可以数不是非要1位= =这样如果多余1位,0不能作为最高位。
对我来说最难的是计算Time Complexity
O(4^n)
T(n) = 3 * T(n-1) + 3 * T(n-2) + 3 * T(n-3) + ... + 3 *T(1);
T(n-1) = 3 * T(n-2) + 3 * T(n-3) + ... 3 * T(1);
Thus T(n) = 4T(n-1);
class Solution {
public List<String> addOperators(String num, int target) {
List<String> res = new ArrayList<>();
if (num == null || num.length() == 0) return res;
dfs(res, new StringBuilder(), num, 0, (long)target, 0);
return res;
}
public void dfs(List<String> res, StringBuilder sb, String s, int pos, long remain, long prev) {
if (pos == s.length() && remain == 0) {
res.add(sb.toString());
} else if (pos == s.length()) {
return ;
} else {
int len = sb.length();
for (int i = pos; i < s.length(); i ++) {
if (i != pos && s.charAt(pos) == '0') break;
long tempVal = Long.valueOf(s.substring(pos, i + 1));
if (pos == 0) {
dfs(res, sb.append(tempVal), s, i + 1, remain - tempVal, tempVal);
} else {
dfs(res, sb.append('+').append(tempVal), s, i + 1, remain - tempVal, tempVal);
sb.setLength(len);
dfs(res, sb.append('-').append(tempVal), s, i + 1, remain + tempVal, -tempVal);
sb.setLength(len);
dfs(res, sb.append('*').append(tempVal), s, i + 1, remain + prev - (prev * tempVal), prev * tempVal);
}
sb.setLength(len);
}
}
}
}