LeetCode.282 - 给表达式添加运算符
给定一个仅包含数字 0-9 的字符串 num
和一个目标值整数 target
,在 num 的数字之间添加二元运算符(不是一元)+、- 或 * ,返回所有能够得到 target
的表达式。
注意,返回表达式中的操作数 不应该 包含前导零。
1 <= num.length <= 10
num 仅含数字
-2 ** 31 <= target <= 2 ** 31 - 1
思路
- 回溯,深度优先搜索
- 粗暴解决方案:遍历每一个可能存在的表达式,通过 eval 进行计算,匹配 target 的表达式加入到结果中
- 将字符串视为由个位数组成的数组,前后两数的结合方式有 * + - 以及直接拼接(特殊情况:前数若为 0 则不可进行拼接操作)
1 | var addOperators = function (num, target) { |
优化方案
- 使用 eval 进行表达式计算,虽然取巧,但性能较差
- 可以在递归过程将部分计算结果向下传递,进而避免子表达式的反复计算
- 考虑到乘法的优先级高于加减法,左右拼接的优先级高于乘法,递归时需要传递多个参数 factor1, factor2, factor3,当前代数式结果
curResult = factor1 + factor2 * factor3
[factor1, factor2, factor3]
初始值为[0, 1, vals[0]]
- 加法运算时,
[factor1, factor2, factor3]
迭代为[curResult, 1, nextVal]
- 减法运算时,
[factor1, factor2, factor3]
迭代为[curResult, -1, nextVal]
- 乘法运算时,
[factor1, factor2, factor3]
迭代为[factor1, factor2 * factor3, nextVal]
- 结合计算时,
[factor1, factor2, factor3]
迭代为[factor1, factor2 * factor3, factor3 * 10 + nextVal]
- 使用 number 数组 vals 取代 num 字符串以便代数计算
1 | var addOperators = function (num, target) { |