Skip to main content

241.js

/** ------------------------------------------------------------------------------
*
* 241. Different Ways to Add Parentheses
* Topics: DP Recursion
* https://leetcode.com/problems/different-ways-to-add-parentheses/description/
*
------------------------------------------------------------------------------ */
// var diffWaysToCompute = function (expression) {
// const results = []

// for (let i = 0; i < expression.length; i++) {
// if (expression[i] === "+" || expression[i] === "-" || expression[i] === "*" || expression[i] === "/") {
// const left = diffWaysToCompute(expression.slice(0, i))
// const right = diffWaysToCompute(expression.slice(i + 1))

// for (let j = 0; j < left.length; j++) {
// for (let k = 0; k < right.length; k++) {
// switch (expression[i]) {
// case "+":
// results.push(left[j] + right[k])
// break
// case "-":
// results.push(left[j] - right[k])
// break
// case "*":
// results.push(left[j] * right[k])
// break
// case "/":
// results.push(left[j] / right[k])
// break
// }
// }
// }
// }
// }

// if (results.length === 0) return [+expression]

// return results
// }

var diffWaysToCompute = function (expression) {
const memo = {}

const ways = (exp) => {
if (memo[exp]) return memo[exp]

const result = []

for (let i = 0; i < exp.length; i++) {
if (["+", "-", "*", "/"].includes(exp[i])) {
const left = ways(exp.slice(0, i))
const right = ways(exp.slice(i + 1))

for (let j = 0; j < left.length; j++) {
for (let k = 0; k < right.length; k++) {
switch (exp[i]) {
case "+":
result.push(left[j] + right[k])
break
case "-":
result.push(left[j] - right[k])
break
case "*":
result.push(left[j] * right[k])
break
case "/":
result.push(left[j] / right[k])
break
default:
break
}
}
}
}
}

if (result.length === 0) result.push(+exp)

memo[exp] = result
console.log(memo)
return result
}

return ways(expression)
}

console.log(diffWaysToCompute("2*3-4*5"))