题目
给你一个由数字和运算符组成的字符串
expression,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以 按任意顺序 返回答案
输入: expression = "2-1-1"
输出: [0,2]
题解
第一种
我们在函数中进行判断,如果当前expression参数长度为1,则将expression参数转换成数字后并返回一个包含该数字的数组,接下来我们在声明一个数组codeArr,数组codeArr里面包含加号、减号和乘号三种运算符,在声明一个变量map它是一个Map对象,用于记录我们已经计算过的表达式及其结果可以避免我们重复计算,接下来我们使用正则表达式将表达式字符串转换成一个数组arr,其中每个元素为数字或运算符,在调用dfs函数对表达式进行深度优先搜索,我们可以得到所有可能的计算结果,在dfs函数中我们首先将当前数组arr转换成一个字符串key,作为map对象的键值,我们使用Map对象的has方法判断map对象中是否已经包含了key,如果包含了我们则直接返回对应的结果即可,没有则继续往下判断当前数组arr的长度是否小于等于1,如果满足则将该数组转换成数字并返回一个包含该数字的数组,如果不满足,我们则声明一个res常量,然后我们进行遍历数组arr,我们在循环中进行判断当前元素是否为运算符,如果是我们则将数组分成左右两个部分,分别递归调用dfs函数,得到左右两个部分的所有可能计算结果,然后将左右两个部分的所有可能计算结果进行组合,得到当前表达式的所有可能计算结果,并将这些结果添加到数组res中,最后我们将当前表达式及其所有可能计算结果添加到map对象中,并将结果数组res返回即可
var diffWaysToCompute = function(expression) {
if (expression.length === 1) return [Number(expression)];
const codeArr = ["+", "-", "*"];
const map = new Map();
const arr = expression.match(/([0-99]+)|[-|*|+]+/g);
return dfs(arr);
function dfs(arr) {
const key = arr.join("");
if (map.has(key)) {
return map.get(key);
}
if (arr.length <= 1) {
const res = [eval(key)];
map.set(key, res);
return res;
}
const res = [];
for (let i = 0; i < arr.length; i++) {
if (codeArr.includes(arr[i])) {
const left = dfs(arr.slice(0, i));
const right = dfs(arr.slice(i + 1));
for (let x = 0; x < left.length; x++) {
for (let j = 0; j < right.length; j++) {
res.push(eval(`${left[x]} ${arr[i]} ${right[j]}`));
}
}
}
}
map.set(key, res);
return res;
}
};
坚持努力,无惧未来!