「前端刷题」282.给表达式添加运算符(HARD)

123 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

题目(Expression Add Operators)

链接:https://leetcode-cn.com/problems/expression-add-operators
解决数:203
通过率:47.2%
标签:数学 字符串 回溯 
相关公司:facebook google linkedin 

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

注意,返回表达式中的操作数 不应该 包含前导零。

 

示例 1:

输入: num = "123", target = 6
输出: ["1+2+3", "1*2*3"] 
解释: “1*2*3” 和 “1+2+3” 的值都是6。

示例 2:

输入: num = "232", target = 8
输出: ["2*3+2", "2+3*2"]
解释: “2*3+2” 和 “2+3*2” 的值都是8。

示例 3:

输入: num = "3456237490", target = 9191
输出: []
解释: 表达式 “3456237490” 无法得到 9191 。

 

提示:

  • 1 <= num.length <= 10
  • num 仅含数字
  • -231 <= target <= 231 - 1

思路

DFS解决添加运算符问题

代码

function addOperators(num: string, target: number): string[] {
    if (num.length === 0) return [];
    if (num.length === 1) {
        if (+num[0] === target) {
            return [num[0]];
        } else {
            return [];
        }
    }
    let ans = [];
    dfs(num, target, 1, +num[0], num[0], ans);
    return ans;
};

function dfs(num: string, target: number, p: number, lastInt: number, curry: string, ans: string[]) {
    if (p === num.length) {
        if (eval(curry) === target) {
            ans.push(curry);
        }
        return;
    }

    dfs(num, target, p + 1, +num[p], curry + '+' + num[p], ans);
    dfs(num, target, p + 1, +num[p], curry + '-' + num[p], ans);
    dfs(num, target, p + 1, +num[p], curry + '*' + num[p], ans);
    if (Number(lastInt) !== 0) {
        dfs(num, target, p + 1, +`${lastInt}${num[p]}`, curry + num[p], ans);
    }
}

思路2

  1. 当前拼好的字符串表达式
  2. 当前遍历到的下标
  3. 当前表达式的最后一个数
  4. 拼接完后当前表达式的计算结果
  5. 当前表达式最后一组连乘的结果(如果是 '1+2+3',那么该值为最后一个3,如果为'1+2×3'那么该值为最后的 2×3=6)

代码

/**
 * @param {string} num
 * @param {number} target
 * @return {string[]}
 */
var addOperators = function (num, target) {
    const arr = [];
    const dfs = (str, idx, nextNum, res, nextRes) => {
        if (idx !== num.length) {
            let newRes = res;
            let newNextRes = nextRes;
            const currentNum = Number(num[idx]);
            // *
            newNextRes = nextRes * currentNum;
            newRes = res - nextRes + newNextRes;
            dfs(str + "*" + num[idx], idx + 1, currentNum, newRes, newNextRes);
            // +
            newNextRes = currentNum;
            newRes = res + newNextRes;
            dfs(str + "+" + num[idx], idx + 1, currentNum, newRes, newNextRes);
            // -
            newNextRes = -currentNum;
            newRes = res + newNextRes;
            dfs(str + "-" + num[idx], idx + 1, currentNum, newRes, newNextRes);
            // ''
            const newNextNum = nextNum * 10 + currentNum;
            newNextRes = (nextRes / nextNum) * newNextNum;
            newRes = res - nextRes + newNextRes;
            if (newNextNum !== 0) {
                dfs(str + num[idx], idx + 1, newNextNum, newRes, newNextRes);
            }
        } else {
            if (res === target) arr.push(str);
        }
    };
    dfs(num[0], 1, Number(num[0]), Number(num[0]), Number(num[0]));
    return arr;
};