详细讲解:https://www.youtube.com/watch?v=v05R1OIIg08
自己的理解:
image.png
中间for那里注意一下,从i = pos开始,那么我们的t就从num.substring(pos, pos + 1)一直到num.substring(pos, nums.length) 所以我们的i就是从pos到nums.length - 1, substring的尾部取的是i + 1. 注意这里要判断t是不是以0开始并且长度大于1,如果是就非法,直接break 出来;同时要考虑pos==0的特殊情况,因为此时我们没有operator, 我们自动默认赋加号。这个时候我们在此基础上继续dfs,要把把exp变为刚刚读出来的数,prev, curt都更新为这个,只有pos要变成i+1.
其他情况我们继续搜索,更新prev, curt, exp, pos变成i + 1.
class Solution {
public List<String> addOperators(String num, int target) {
List<String> res = new ArrayList<>();
if (num == null || num.length() == 0){
return res;
}
StringBuilder sb = new StringBuilder();
dfs(num, target, 0, sb, 0, 0, res);
return res;
}
//prev : last node val
//curt : curt exp val
private void dfs(String num, int target, int pos, StringBuilder exp, long prev, long curt, List<String> res){
if (pos == num.length()){
if (curt == target){
res.add(exp.toString());
return;
}
}
for (int i = pos; i < num.length(); i++){
//t = s.substring(pos, pos + 1) to t = s.substring(pos, nums.length)
String t = num.substring(pos, i + 1);
if (t.length() > 1 && t.charAt(0) == '0'){//0X 00 05
break;
}
long n = Long.parseLong(t);
int len = exp.length();
if (pos == 0){// no operator yet
//t = s.substring(0, i + 1) 下一个从s.charAt(i + 1)开始处理 pos = i + 1
//123 要处理1 12 123三种情况,所以要continue不能break
dfs(num, target, i + 1, exp.append(t), n, n, res);
exp.setLength(len);
continue;
}
dfs(num, target, i + 1, exp.append("+").append(t), n, curt + n, res);
exp.setLength(len);
dfs(num, target, i + 1, exp.append("-").append(t), -n, curt - n, res);
exp.setLength(len);
dfs(num, target, i + 1, exp.append("*").append(t), prev * n, curt - prev + prev * n, res);
exp.setLength(len);
}
}
}
变种是给一个字符串,全部由数字组成,再给一个int target,要求在字符串里插入+或者-,使字符串的表达式值刚好等于target,返回number of solutions。