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;
}
};