累加数 是一个字符串,组成它的数字可以形成累加序列。
一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
给你一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。
说明:累加序列里的数 不会 以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
来源力扣(LeetCode)
class Solution {
public boolean isAdditiveNumber(String num) {
return dfs(num, 0, 0, 0, 0);
}
private boolean dfs(String num, int index, int count, long prevprev, long prev) {
if (index >= num.length()) {
return count > 2;//这样保证至少三个数!!!
}
long current = 0;//这个是为了判断两个数之和
for (int i = index; i < num.length(); i++) {//遍历每个元素
char c = num.charAt(i);//获得i索引处的字符
if (num.charAt(index) == '0' && i > index) {
// 不能做为前导0,但是它自己是可以单独做为0来使用的
return false;
}
current = current * 10 + c - '0';
if (count >= 2) {
long sum = prevprev + prev;//2个数之和
if (current > sum) {
// 如果当前数比之前两数的和大了,说明不合适
return false;
}
if (current < sum) {
//如果当前数比之前两数的和小了,说明还不够,可以继续添加新的字符进来
continue;
}
}
// 当前满足条件了,或者还不到两个数,向下一层探索
if (dfs(num, i + 1, count + 1, prev, current)) {
return true;
}
}
return false;
}
}