给表达式添加运算符

1、描述

给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,返回所有能够得到目标值的表达式。

示例 1:

输入: num = “123”, target = 6
输出: [“1+2+3”, “123”]
示例 2:

输入: num = “232”, target = 8
输出: [“23+2", "2+32”]
示例 3:

输入: num = “105”, target = 5
输出: [“1*0+5”,“10-5”]
示例 4:

输入: num = “00”, target = 0
输出: [“0+0”, “0-0”, “0*0”]

来源:力扣(LeetCode)
链接:

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2、关键字

添加运算符,表达式,

3、思路

一眼就是回溯

4、notes

不太会写

6、code

class Solution {
    using ll = long long;
public:
    string num;
    vector<string> ret;
    int n, target;

    void backtrack(string &s, int index, ll res, ll mul) {
        // 当前已达到字符串末尾,若结果正确,则加入结果数组
        // 不论正确与否,都应返回
        if (index == n) {
            if (res == target) {
                ret.emplace_back(s);
            }
            return;
        }

        // 当前表达式长度
        int m = s.size();
        if (index > 0) {
            s.push_back(0); // 占位,下面填充符号
        }
        ll val = 0;
        // 枚举截取的数字长度(取多少位),注意数字可以是单个 0 但不能有前导零
        for (int j = index; j < n && (j == index || num[index] != '0'); ++j) {
            val = val * 10 + num[j] - '0';
            s.push_back(num[j]);
            if (index == 0) { // 表达式开头不能添加符号
                backtrack(s, j + 1, val, val);
            } else { // 枚举符号
                // 加法
                s[m] = '+'; backtrack(s, j + 1, res + val, val);
                // 减法
                s[m] = '-'; backtrack(s, j + 1, res - val, -val);
                // 乘法
                s[m] = '*'; backtrack(s, j + 1, res - mul + mul * val, mul * val);
            }
        }
        s.resize(m);
    };

    vector<string> addOperators(string _num, int _target) {
        num = _num;
        n = _num.length();
        target = _target;
        string s;
        backtrack(s, 0, 0, 0);
        return ret;
    }
};



上一篇:groovy-搭建环境


下一篇:DSL和java调用