官方写法
class Solution {
public ArrayList<String> answer;
public String digits;
public long target;
public void recurse(
int index, long previousOperand, long currentOperand, long value, ArrayList<String> ops) {
String nums = this.digits;
if (index == nums.length()) {
if (value == this.target && currentOperand == 0) {
StringBuilder sb = new StringBuilder();
ops.subList(1, ops.size()).forEach(v -> sb.append(v));
this.answer.add(sb.toString());
}
return;
}
currentOperand = currentOperand * 10 + Character.getNumericValue(nums.charAt(index));
String current_val_rep = Long.toString(currentOperand);
int length = nums.length();
if (currentOperand > 0) {
recurse(index + 1, previousOperand, currentOperand, value, ops);
}
ops.add("+");
ops.add(current_val_rep);
recurse(index + 1, currentOperand, 0, value + currentOperand, ops);
ops.remove(ops.size() - 1);
ops.remove(ops.size() - 1);
if (ops.size() > 0) {
ops.add("-");
ops.add(current_val_rep);
recurse(index + 1, -currentOperand, 0, value - currentOperand, ops);
ops.remove(ops.size() - 1);
ops.remove(ops.size() - 1);
ops.add("*");
ops.add(current_val_rep);
recurse(
index + 1,
currentOperand * previousOperand,
0,
value - previousOperand + (currentOperand * previousOperand),
ops);
ops.remove(ops.size() - 1);
ops.remove(ops.size() - 1);
}
}
public List<String> addOperators(String num, int target) {
if (num.length() == 0) {
return new ArrayList<String>();
}
this.target = target;
this.digits = num;
this.answer = new ArrayList<String>();
this.recurse(0, 0, 0, 0, new ArrayList<String>());
return this.answer;
}
}
另一篇题解 用的StringBuilder操作
class Solution {
public List<String> addOperators(String num, int target) {
List<String> result = new ArrayList<>();
addOperatorsHelper(num, target, result, new StringBuilder(), 0, 0, 0);
return result;
}
private void addOperatorsHelper(String num, int target, List<String> result, StringBuilder path, int start, long eval, long pre) {
if (start == num.length()) {
if (target == eval) {
result.add(path.toString());
}
return;
}
for (int i = start; i < num.length(); i++) {
if (num.charAt(start) == '0' && i > start) {
break;
}
long cur = Long.parseLong(num.substring(start, i + 1));
int len = path.length();
if (start == 0) {
addOperatorsHelper(num, target, result, path.append(cur), i + 1, cur, cur);
path.setLength(len);
} else {
addOperatorsHelper(num, target, result, path.append("+").append(cur), i + 1, eval + cur, cur);
path.setLength(len);
addOperatorsHelper(num, target, result, path.append("-").append(cur), i + 1, eval - cur, -cur);
path.setLength(len);
addOperatorsHelper(num, target, result, path.append("*").append(cur), i + 1, eval - pre + pre * cur,
pre * cur);
path.setLength(len);
}
}
}
}