leetcode306.累加数

1.题目描述

累加数是一个字符串,组成它的数字可以形成累加序列。

一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。

给定一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是累加数。

说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。

示例 1:

输入: "112358"
输出: true 
解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
示例 2:

输入: "199100199"
输出: true 
解释: 累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199

2.解题思路

通过两个for 枚举选择前两个数,找到第一个数和第二个数后,计算和,判断和是否是接下来的第三个数即可

指针 i 用于确定第一个数,即 first=num[ : i],指针 j 用于确定第二个数,即 second=num[i: j+1],判断第一个数和第二个数的 sum是否出现在字符串的第 j+1 个位置上,

如果是,则将 second 和 sum 分别赋值给 first 和 second,因此其实只要确定前两个个数,后面的数都是固定的,dfs递归继续向后判断,若是直到字符串结尾,返回True

如果不是,继续枚举第二个数,j 向后移动一位(j++),继续判断first=num[ : i],second=num[i: j+1]

如果j走到了字符串尾部,还未找到等于前两个数和的第三个数,则枚举第一个数,i 向后移动一位(i++),继续判断 first=num[ : i],second=num[i: j+1]

如果 i 走到了整个字符串长度的一半的位置,还未出现第三个数,则返回False

具体细节详见代码实现,注意两个特殊条件:

1.如果second中的第一位数是0,且和后面的数一起被作为second(即second的长度不为1),这个是不行的,需要continue

2.如果first中的第一位数是0,且和后面的数一起被作为first(即first的长度不为1),这个是不行的,需要continue

3.代码实现

class Solution:

    def isAdditiveNumber(self, num: str) -> bool:
        for i in range(1,int(len(num)/2)+1):
            # i是分割first与second的分割索引,所以i从1开始,但是第一个数不能超过整个字符串长度的一半
            for j in range(i,int(len(num))):
                # 过滤掉 "1023"
                # 但是如果second这位(第一位)为0,且只有1位数,是可以的,比如“000000”,否则看成02=2是不可以的
                if int(num[i]) == 0 and len(num[i:j+1])!= 1:
                    continue
                # 过滤掉 "0235813"
                # 但是如果第一位为0且只有这一位数,是可以的,比如“01123”,否则看成02=2是不可以的
                if int(num[0]) == 0 and len(num[:i]) != 1:
                    continue
                if self.dfs(num[:i],num[i:j+1],j+1,num):
                    return True
        return False

    def dfs(self, first, second, index, num):
        # 如果在第一个函数钟不加前面两个if,这里会把"02"变成2
        third = int(first)+ int(second)
        if num.find(str(third),index) == index:
            if index + len(str(third)) == len(num):
                return  True
            else:
                # 记得前面加return
                return self.dfs(second,third,index+len(str(third)), num)
        else: 
            return False

代码参考:作者:WangRuiZhi,链接:https://leetcode-cn.com/problems/additive-number/solution/python3-dfs-100-by-wangruizhi/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值