【Leetcode】282. Expression Add Operators 282. 给表达式添加运算符

1

解法

首先,假如每个数字只有一位,那么算法很简单,回溯,遍历每个缝隙的符号值(+\-\*),遍历完毕之后看最后得到的表达式的值是不是target

接着,现在每个数字可以有1位以上,所以遍历的选择要多一个,就是除了"+"``"-"``"*"之外,还有""空串。

如果每到终点用eval等函数重新计算时间很很慢,所以要动态地追踪表达式的值

  • 如果只有+-,是很容易追溯的。
  • 如果有*的话,可以这么算,除了表达式的值之外,可以再记录一个prev,表示表达式最后一个数的值。
    比如1+2就是21-2就是-21-2*3就是-6,这样就可以倒推回去。
    最后表达式的值就变成,v-prev+prev*int(s[i])
  • 现在来解决""空串,我们需要知道最后一个数字的值last
    新prev = prev/last*(10*last+int(s[i]))
    新v = v-prev+新prev
class Solution(object):
    def addOperators(self, s, target):
        """
        :type num: str
        :type target: int
        :rtype: List[str]
        """
        n = len(s)
        ans = []
        if s == "":
            return []

        def solve(now, i, v, prev, last):
            if i == n:
                # if eval(now)!=v:
                #     print now,v
                if v == target:
                    ans.append(now)
                return
            # add
            solve(now + "+" + s[i], i + 1, v + int(s[i]), int(s[i]), int(s[i]))
            # sub
            solve(now + "-" + s[i], i + 1, v - int(s[i]), -int(s[i]), int(s[i]))
            # multi
            solve(now + "*" + s[i], i + 1, v - prev + prev * int(s[i]), prev * int(s[i]), int(s[i]))
            # space
            if last!=0:
                solve(now + s[i], i + 1, v + 9 * prev + int(s[i])*prev/last, 10 * prev + int(s[i]) *prev/last, last*10+int(s[i]))

        solve(s[0], 1, int(s[0]), int(s[0]), 1)
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值