leet-code/src/main/java/leetcode/editor/cn/ExpressionAddOperators.java
2021-10-16 22:21:15 +08:00

110 lines
2.8 KiB
Java

//给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,返回所
//有能够得到目标值的表达式。
//
//
//
// 示例 1:
//
//
//输入: num = "123", target = 6
//输出: ["1+2+3", "1*2*3"]
//
//
// 示例 2:
//
//
//输入: num = "232", target = 8
//输出: ["2*3+2", "2+3*2"]
//
// 示例 3:
//
//
//输入: num = "105", target = 5
//输出: ["1*0+5","10-5"]
//
// 示例 4:
//
//
//输入: num = "00", target = 0
//输出: ["0+0", "0-0", "0*0"]
//
//
// 示例 5:
//
//
//输入: num = "3456237490", target = 9191
//输出: []
//
//
//
// 提示:
//
//
// 1 <= num.length <= 10
// num 仅含数字
// -2³¹ <= target <= 2³¹ - 1
//
// Related Topics 数学 字符串 回溯 👍 324 👎 0
package leetcode.editor.cn;
import java.util.ArrayList;
import java.util.List;
//282:给表达式添加运算符
class ExpressionAddOperators {
public static void main(String[] args) {
//测试代码
Solution solution = new ExpressionAddOperators().new Solution();
}
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
int n;
String num;
int target;
List<String> ans;
public List<String> addOperators(String num, int target) {
this.n = num.length();
this.num = num;
this.target = target;
this.ans = new ArrayList<>();
StringBuffer expr = new StringBuffer();
backtrack(expr, 0, 0, 0);
return ans;
}
public void backtrack(StringBuffer expr, int i, long res, long mul) {
if (i == n) {
if (res == target) {
ans.add(expr.toString());
}
return;
}
int signIndex = expr.length();
if (i > 0) {
expr.append(0);
}
long val = 0;
for (int j = i; j < n && (j == i || num.charAt(i) != '0'); ++j) {
val = val * 10 + num.charAt(j) - '0';
expr.append(num.charAt(j));
if (i == 0) {
backtrack(expr, j + 1, val, val);
} else {
expr.setCharAt(signIndex, '+');
backtrack(expr, j + 1, res + val, val);
expr.setCharAt(signIndex, '-');
backtrack(expr, j + 1, res - val, -val);
expr.setCharAt(signIndex, '*');
backtrack(expr, j + 1, res - mul + mul * val, mul * val);
}
}
expr.setLength(signIndex);
}
}
//leetcode submit region end(Prohibit modification and deletion)
}