Given a string that contains only digits 0-9
and a target value, return all possibilities to add binary operators (not unary) +
, -
, or *
between the digits so they evaluate to the target value.
Examples:
"123", 6 -> ["1+2+3", "1*2*3"]
"232", 8 -> ["2*3+2", "2+3*2"]
"105", 5 -> ["1*0+5","10-5"]
"00", 0 -> ["0+0", "0-0", "0*0"]
"3456237490", 9191 -> []
思路:这个题目考察的非常好。区分度很大。首先想到是dfs+backtracking这谁都没问题,然后从例子中看到10-5,说明数字还是可以连续的在一起组成一个新的数字的,那么递归毫无疑问了,substring,这题关键点在于3-1*4出现这种情况,*4的时候,怎么和之前计算的结果进行发生关系导出后面的结果,这里的tricky的地方就是要传递一个上次计算出现的值,preNum,这样3-1=2, 那么curSum = 2, preNum = -1,那么由curSum -preNum 得到3,那么再有preNum * curNum计算得到-1*4,另外,还有一个坑就是string的题,只要有数字,就要想到溢出问题,解决方案就是用long来解决。
class Solution {
//3-1*4
public List<String> addOperators(String num, int target) {
List<String> list = new ArrayList<>();
if(num == null || num.isEmpty()) {
return list;
}
StringBuilder sb = new StringBuilder();
dfs(list, num, 0, 0, 0, sb, target);
return list;
}
private void dfs(List<String> list, String num, long cursum, long preNum, int index,
StringBuilder sb, int target) {
if(index == num.length()) {
if(cursum == target) {
list.add(sb.toString());
}
return;
}
for(int i = index; i < num.length(); i++) {
String str = num.substring(index, i + 1);
if(str.length() > 1 && str.charAt(0) == '0') {
continue;
}
long curNum = Long.parseLong(str);
int len = sb.length();
if(index == 0) {
//第一个数,不需要加任何符号;
dfs(list, num, curNum, curNum, i + 1, sb.append(str), target);
sb.setLength(len);
} else {
// +;
dfs(list, num, cursum + curNum, curNum, i + 1, sb.append("+").append(str), target);
sb.setLength(len);
// -;
dfs(list, num, cursum - curNum, -curNum, i + 1, sb.append("-").append(str), target);
sb.setLength(len);
// *;
dfs(list, num, cursum - preNum + preNum * curNum, preNum * curNum, i + 1, sb.append("*").append(str), target);
sb.setLength(len);
}
}
}
}