詳細(xì)講解: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, 我們自動默認(rèn)賦加號。這個時候我們在此基礎(chǔ)上繼續(xù)dfs,要把把exp變?yōu)閯倓傋x出來的數(shù),prev, curt都更新為這個,只有pos要變成i+1.
其他情況我們繼續(xù)搜索,更新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);
}
}
}
變種是給一個字符串,全部由數(shù)字組成,再給一個int target,要求在字符串里插入+或者-,使字符串的表達(dá)式值剛好等于target,返回number of solutions。