力扣 306累加树

'''
采用了一种比较麻烦的方法:
先通过双重循环找到第一个数字和第二个数字,然后循环计算后边的value。
'''
class Solution:
    def isAdditiveNumber(self, num: str) -> bool:
        
        nums = [n for n in num]
        self.res = False
        # 第一个数肯定在字符串的前1/2,通过记录数字的位置,来计算数字和
        # 最重要的是确定第一个数和第二个数
        pre = 0
        post = 0
        for i in range(1, len(nums)//2+1):
            pre = nums[:i]
            if pre[0] == "0" and len(pre) > 1:
                continue
            pre = eval(''.join(pre))
  
            for j in range(i, len(nums)-1):
                post = nums[i:j+1]
                if post[0] == "0" and len(post) > 1:
                    continue
                post = eval(''.join(post))

                res = pre + post
                rel_len = len(str(res))
                # print(''.join(nums[j+1:j+rel_len+1]))
                if j+rel_len+1 > len(nums):
                    continue
                rel = nums[j+1:j+rel_len+1]
                
                if rel[0] == "0" and len(rel) > 1:
                    continue
                rel = eval(''.join(rel))
                if res == rel:
                    self.drawback(nums[j+1:], pre, post)
                    
        return self.res
    
    def drawback(self, nums, pre, post):
        if len(nums) == 0:
            self.res = True
            return
        
        res = pre + post
        rel_len = len(str(res))
        rel = nums[:rel_len]
        # print(rel)
        if rel[0] == "0" and len(rel) > 1:
            return
        rel = eval(''.join(rel))
        if res == rel:
            self.drawback(nums[rel_len:], post, res)


        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值