首页 > 试题广场 >

给表达式添加运算符

[编程题]给表达式添加运算符
  • 热度指数:1170 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个仅包含数字的字符串 num 和一个目标值 target,在 num 的数字之间添加二元运算符 "+" , "-" 或 "*" ,返回所有能够得到目标值的表达式。

数据范围:字符串长度满足 , nums 中仅包含数字,
示例1

输入

"123",6

输出

["1+2+3","1*2*3"]
示例2

输入

"00",0

输出

["0+0","0*0","0-0"]
import java.util.*;


public class Solution {
    public String[] addOpt(String num, int target) {
        List<String> result = new ArrayList<>();
        backtrack(result, num, target, "", 0, 0, 0);
        return result.toArray(new String[0]);
    }

    public void backtrack(List<String> result, String num, int target, String expr,
                          int index, long eval, long multed) {
        if (index == num.length()) {
            if (eval == target) {
                result.add(expr);
            }
            return;
        }
        for (int i = index; i < num.length(); i++) {
            if (i != index && num.charAt(index) == '0') {
                break;
            }
            long curr = Long.parseLong(num.substring(index, i + 1));
            if (index == 0) {
                backtrack(result, num, target, expr + curr, i + 1, curr, curr);
            } else {
                backtrack(result, num, target, expr + "+" + curr, i + 1, eval + curr, curr);
                backtrack(result, num, target, expr + "-" + curr, i + 1, eval - curr, -curr);
                backtrack(result, num, target, expr + "*" + curr, i + 1,
                          eval - multed + multed * curr, multed * curr);
            }
        }
    }
}

发表于 2024-05-02 18:58:07 回复(0)