注:
题目:
题解:
解题思路
- 为了处理大正数相加,编写一个sum()函数将字符串相加,避免转换为int消耗时间与溢出。
- 第一个数字的起始下标一定是0,但是第二和第三个数字的起始下标不固定,需要通过两层循环枚举,在拿到前两个数字之后,将这两个数字相加,之后与第三个数字比较,如果相等,就可以dfs下一组数字,一直到最后验证是否整个字符串符合要求。
- 这道题dfs的递归结束条件和普通稍有不同,要仔细思考。这里递归成功的标志是一直到字符串最后一个字符都满足要求,即是累加序列,那么我们需要看是否能够递归到最后一个位置正好结束。
class Solution {
public:
//计算两个字符串相加的函数
string sum(string a,string b){
int size1=a.size();
int size2=b.size();
string result;
int carry=0;
while(size1>0||size2>0||carry>0){
int num1=(size1>0?a[size1-1]-'0':0);
int num2=(size2>0?b[size2-1]-'0':0);
int sum=num1+num2+carry;
if(sum>=10){
sum=sum-10;
carry=1;
}
else{
carry=0;
}
result=to_string(sum)+result;
size1--;
size2--;
}
return result;
}
//判断一组数字是否符合要求的函数
bool dfs(string &num, int firststart,int secondstart,int thirdstart){
//如果当前数字以0开始,并且不是0,则返回false
if((num[firststart]=='0'&&secondstart-firststart>1)||(num[secondstart]=='0'&&thirdstart-secondstart>1)){
return false;
}
string n1=num.substr(firststart,secondstart-firststart);
string n2=num.substr(secondstart,thirdstart-secondstart);
//addnum表示前两个数字之和
string addnum=sum(n1,n2);
int size=addnum.size();
if(thirdstart+size>num.size()){
return false;
}
//n3表示当前组合中的第三个数字
string n3=num.substr(thirdstart,size);
if(n3!=addnum){
return false;
}
//只有n3==addnum并且枚举到了最后一个数字,才返回true
if(n3==addnum&&thirdstart+size==num.size()){
return true;
}
return dfs(num,secondstart,thirdstart,thirdstart+size);
}
bool isAdditiveNumber(string num) {
int firststart=0;
int secondstart=0;
int thirdstart=0;
//第一个数字肯定是从0开始的,因此需要枚举第二个数字和第三个数字是否符合要求
for(secondstart=firststart+1;secondstart<num.size();secondstart++){
for(thirdstart=secondstart+1;thirdstart<num.size();thirdstart++){
if(dfs(num,firststart,secondstart,thirdstart)){
return true;
}
}
}
return false;
}
};