题目描述:
累加数 是一个字符串,组成它的数字可以形成累加序列。
一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
给你一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。
说明:累加序列里的数 不会 以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
样例:
方法一:
class Solution {
public:
int n;
string num;
bool isAdditiveNumber(string num) {
this->num = num;
n = num.size();
for (int i = 0; i < n; i++)
{
string first = num.substr(0, i + 1);
//排除两位数的数字,以0开头的情况
if (first.size() > 1 && first[0] == '0') break;
for (int j = i + 1; j < n; j++)
{
string second = num.substr(i + 1, j - i);
//排除两位数的数字,以0开头的情况
if (second.size() > 1 && second[0] == '0') break;
if (dfs(first, second, first + second))
{
return true;
}
}
}
return false;
}
bool dfs(string first, string second, string cur)
{
string third = addstring(first, second);
cur += third;
//如果最终得到的字符串就是num,说明是累加数
if (cur == num) return true;
//如果某次相加得到的字符串与原本相同位置上的字符串有差别,则说明当前情况不对
else if (cur != num.substr(0, cur.size()))
{
return false;
}
return dfs(second, third, cur);
}
//字符串相加函数
string addstring(string str1, string str2)
{
int i = str1.size() - 1;
int j = str2.size() - 1;
int carry = 0;
string ans;
while (i >= 0 || j >= 0 || carry)
{
int cur1 = i >= 0 ? str1[i] - '0' : 0;
int cur2 = j >= 0 ? str2[j] - '0' : 0;
int temp = cur1 + cur2 + carry;
carry = temp / 10;
char ch = temp % 10 + '0';
ans = ch + ans;
i--; j--;
}
return ans;
}
};
第一眼dfs,但是还是d不出来,看了题解后先去学了学字符串相加的方法:力扣
这题的思路主要在于,对于给定的两个数字字符串,和最终的字符串的长度,那么这个累加数的序列是固定的,所以可以枚举前两个数字,再求出后续的字符串,若与原本的字符串num相等,则说明num是一个累加数序列。