算法题解-运算表达式设计优先级

116 阅读2分钟

题目

给你一个由数字和运算符组成的字符串 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;
  }
};

坚持努力,无惧未来!