LeetCode 241 Different Ways to Add Parentheses

427 阅读1分钟

问题地址:https://leetcode.com/problems/different-ways-to-add-parentheses/description/

题意: 给个不带括号的运算表达式,返回加上各种括号后可能的结果数组。

Example 1
Input: "2-1-1".

((2-1)-1) = 0
(2-(1-1)) = 2
Output: [0, 2]


Example 2
Input: "2*3-4*5"

(2*(3-(4*5))) = -34
((2*3)-(4*5)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10
Output: [-34, -14, -10, -10, 10]

思路: 利用嵌套 以运算符为分隔符,循环每个分隔符,左右分为2个运算式,各自嵌套调用。

注意点: js利用eval计算,小心负数情况,在运算数外边加层括号,否则'1--2'这样的eval运算会出错。

js代码:

/**
 * @param {string} input
 * @return {number[]}
 */
var diffWaysToCompute = function(input) {
    var nums = input.match(/\d+/g);
    var operators = input.match(/\+|-|\*/g);
    if(nums.length <= 2){ // 只有2个运算数字
        return [eval(input)];
    }
    else if(nums.length <= 3){ // 有3个运算数字
        var arr = [];
        arr.push(eval('(' + '(' + nums[0] + ')' + operators[0] + '(' + nums[1] + ')' + ')' + operators[1] + '(' +  nums[2] + ')'));
        arr.push(eval('(' + nums[0] + ')' + operators[0] + '(' + '(' + nums[1] + ')' + operators[1] + '(' + nums[2] + ')' + ')'));
        return arr;
    }
    else{
        var arr = [];
        for(var i = 0;i < operators.length; ++i){
            var leftStr = '', rightStr = '', operator = operators[i];
            for(var j = 0; j <= i; ++j){
                leftStr += nums[j];
                if(j < i){
                    leftStr += operators[j];
                }
            }
            for(var j = i + 1; j <= operators.length; ++j){
                rightStr += nums[j];
                if(j < operators.length){
                    rightStr += operators[j];
                }
            }
            var leftRes = diffWaysToCompute(leftStr);
            var rightRes = diffWaysToCompute(rightStr);
            var totalRes = [];
            for(var kk = 0; kk < leftRes.length; ++kk){
                for(var pp = 0; pp < rightRes.length; ++pp){
                    totalRes.push(eval('(' + leftRes[kk] + ')' + operator + '(' + rightRes[pp] + ')'));
                }
            }
            arr = arr.concat(totalRes);
        }
        return arr;
    }
};