Problem
Given a string num
that contains only digits and an integer target
, return all possibilities to add the binary operators '+'
, '-'
, or '*'
between the digits of num
so that the resultant expression evaluates to the target
value.
Example 1:
1 | Input: num = "123", target = 6 |
Example 2:
1 | Input: num = "232", target = 8 |
Example 3:
1 | Input: num = "105", target = 5 |
Example 4:
1 | Input: num = "00", target = 0 |
Example 5:
1 | Input: num = "3456237490", target = 9191 |
Constraints:
1 <= num.length <= 10
num
consists of only digits.-231 <= target <= 231 - 1
Analysis
题目给出一个仅由数字组成的字符串,要求在数字之间插入+
、-
和*
这三种运算符,使得运算结果等于给出的target
。因为题目要求返回全部的结果,所以很明显思路就是递归+回溯。主要的思路有了,比较难解决的点就是如何去判断表达式是否等于target。计算算术表达式之前也碰到过类似的题目,一般都是采用栈的方式,但这里我们希望不是到最后一步才进行运算,而是在过程中就进行运算。比如2+3*2
,我们先计算了2+3
,再碰到2
时,我们需要计算三种情况:
+2
:加法的优先级最低,所以可以直接相加;-2
:减法的优先级也是最低,也可以直接相加;*2
:乘法的优先级较高,需要特殊处理。我们需要记录前一次变更的大小diff
,在这里diff = 3
。然后用curNum - diff = 5 - 3 = 2
,得到上上次的值,然后再把上次变更的值与2相乘,最后得到结果curNum - diff + diff * 2
按照这种方法我们就可以按照顺序从左到右进行计算,而不需要到最后再一次过进行计算。判断符合要求的条件是当剩余的num
长度为0并且当前的值等于target
,则添加到答案中。
这里还需要注意一种情况,就是数字开头有多余的0,所以当我们切分字符串时,发现长度大于1且第一个字符是0,说明是非法的,可以直接跳过后续的递归。
Solution
无
Code
1 | class Solution { |
Summary
这道题目主要的思路是递归+回溯,难点在于算术运算。这里给出了一种新的思路去从左往右计算算术表达式。这道题目的分享到这里,感谢你的支持!