累加数 是一个字符串,组成它的数字可以形成累加序列。
一个有效的 累加序列 必须 至少 包含 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)组成
进阶:你计划如何处理由过大的整数输入导致的溢出?
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/additive-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
暴力递归切分字符串,每次递归且分出一个子字符串,然后判断这个子字符串表示的数字是否等于前两个数的和。
若是第一个第二个数不做这个判断。
递归结束的条件当当前切分的位置已经走到num的结尾以后,仍然没有被踢退说明满足条件,返回true。
class Solution {
public boolean isAdditiveNumber(String num) {
return dfs(num,0,0,0,0);
}
public boolean dfs(String num, int index, int count, long prepre, long pre) {
if (index == num.length()) {
if (count < 3) {
return false;
}
return true;
}
boolean ans = false;
for (int i = index + 1; i <= num.length(); i++) {
String str = num.substring(index,i);
if (str.length() > num.length() / 2) {
break;
}
long cur = Long.parseLong(str);
if (cur > 0 && num.charAt(index) == '0') {
continue;
}
if (count == 0) {
ans = ans || dfs(num,i,count+1,cur,0);
} else if (count == 1) {
ans = ans || dfs(num,i,count+1,prepre,cur);
} else {
if (cur != pre + prepre) {
continue;
}
ans = ans || dfs(num,i,count+1,pre,cur);
}
if (ans) {
return ans;
}
}
return ans;
}
}