题目
306
累加数 是一个字符串,组成它的数字可以形成累加序列。
一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。
给你一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。
说明:累加序列里的数,除数字 0 之外,不会 以 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
提示:
1 <= num.length <= 35
num 仅由数字(0 - 9)组成
题解
class Solution {
List<Integer> path = new ArrayList<>();
char[] s;
public boolean isAdditiveNumber(String num) {
s = num.toCharArray();
return dfs(0);
}
private boolean dfs(int index) {
//判断path里面的三个数据是否是累加数
if (path.size() >= 3) {
int end = path.size() - 1;
if (path.get(end) != path.get(end - 1) + path.get(end - 2)) {
return false;
}
}
if (index == s.length) {
return path.size() >= 3;
}
char cur = s[index];
//如果遍历到0,直接加入path,否则就遍历加入path
//例如 199100199 第一次 path里面1 第二次 1 9 第三次 1 9 9 第四次 1 9 91
//第五次 1 9 910 。。。最后 1 9 9100199 返回false 下次递归 path里面 1 99 。。。继续递归
if (cur == '0') {
path.add(cur - '0');
if (dfs(index + 1)) {
return true;
}
path.remove(path.size() - 1);
} else {
int x = 0;
for (int j = index; j < s.length; j++) {
x = x * 10 + s[j] - '0';
path.add(x);
if (dfs(j + 1)) {
return true;
}
path.remove(path.size() - 1);
}
}
return false;
}
}