题目描述
累加数是一个字符串,组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 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
进阶:
你如何处理一个溢出的过大的整数输入?
问题分析
先用两层for循环找到前两个数,其中找到的数如果超过一位长度,要检查首位是否为0,如果为0那么要break掉当前循环。在当前找到的两个数下,计算出第三个数,然后将这三个数组成的字符串与给定字符串num相比较,如果小于其长度,那么进入while循环,然后再计算出下一个数,将这四个数组成的字符串与给定字符串num相比较,如果小于其长度,那么继续循环,以此类推。当循环退出时,将几个数组成的字符串与num比较,如果相等返回true,否则继续for循环从一个新的第二个数开始。如果最后所有可能的情况都遍历完了还是没有返回true,那么返回false。
代码实现
class Solution {
public:
bool isAdditiveNumber(string num) {
int n = num.size();
for(int i = 1; i < n; i++){
string s1 = num.substr(0, i);
if(s1.size() > 1 && s1[0] == '0')
break;
for(int j = i + 1; j < n; j++){
string s2 = num.substr(i, j - i);
long i1 = stol(s1);
long i2 = stol(s2);
if(s2.size() > 1 && s2[0] == '0')
break;
long i3 = i1 + i2;
string sum = to_string(i3);
if(sum != num.substr(j, sum.size()))
continue;
string all = s1 + s2 + sum;
while(all.size() < n){
i1 = i2;
i2 = i3;
i3 = i1 + i2;
sum = to_string(i3);
all += sum;
}
if(all == num)
return true;
}
}
return false;
}
};