持续创作,加速成长!这是我参与「掘金日新计划 · 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 <= 10num仅含数字-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',那么该值为最后一个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;
};