Leetcode306题累加数

Leetcode306题累加数

题目描述

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

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

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

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

题目思路

设一个标识位置的变量index,在index为0的时候确定前两个数(前两个数比较特殊),当index不为0时用回溯法运算就行了。
字符串和数值之间的转换函数在这题中也比较重要,下面做个简单的归纳:

stoi:string 到 int

stol: string 到 long

stoll:string 到 long long

stoul:sting 到 unsigned long

stoull:string 到 unsigned long long

stof:string 到 float

stod:string 到 double

stold:string 到 long double

顺便一提,把数值转换到字符串可以使用to_string()

代码

代码写的有点冗长,但运行时间还是蛮客观的,能击败90%多的提交者,其实仔细一想还有很多可以改进的空间,最近由于时间的原因,暂时不做修改,有时间回来填坑。

class Solution {
public:
    void solve(string num,int index,bool& flag,int length1,int length2)
    {
        int l=num.size()/2;
        if(index!=0)
        {
            for(int i=max(length1,length2);i<=1+max(length1,length2);i++)
            {
                if(num[index+length1+length2]=='0'&&i!=1)   return;
                if(index+length1+length2+i>num.size())    return;
              if(stoll(num.substr(index,length1))+stoll(num.substr(index+length1,length2))==stoll(num.substr(index+length1+length2,i)))
                {
                    if(index+length1+length2+i==num.size())
                    {
                        flag=true;
                        return;
                    }
                    else solve(num,index+length1,flag,length2,i);
                }
            }
        }
        else for(int len=1;len<=l;len++)
        {
            if(num[index]=='0'&&len!=1)  continue;
            for(int len1=1;len1<=l;len1++)
            {
                if(num[index+len]=='0'&&len1!=1)   continue;
                for(int i=max(len1,len);i<=1+max(len1,len);i++)
                {
                    if(num[index+len+len1]=='0'&&i!=1)  continue;
                    if(index+len+len1+i<=num.size())
                    if(stoll(num.substr(index,len))+stoll(num.substr(index+len,len1))==stoll(num.substr(index+len+len1,i)))
                    {
                        if(index+len+len1+i==num.size())
                        {
                            flag=true;
                            return;
                        }
                        else solve(num,index+len,flag,len1,i);
                    }
                }
            }
        }
    }
    bool isAdditiveNumber(string num) {
        bool flag=false;
        solve(num,0,flag,1,1);
        return flag;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值