题目描述
累加数 是一个字符串,组成它的数字可以形成累加序列。
一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
给你一个只包含数字 '0'-'9'
的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true
;否则,返回 false
。
说明:累加序列里的数 不会 以 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)
组成
解题思路
首先可以通过 for
循环穷举的方法得到前两个数 num1
和 num2
,该过程有以下需要注意的地方:
-
输入的
num
是一个字符串,那么就需要先获得num1
和num2
分别对应的子字符串后,再将其转换成数字类型。在JavaScript
中获得子字符串可以通过string.substring(i, j)
方法来实现,该方法可以将string
字符串的第i
至第j - 1
位的子字符串切割出来;然后通过Number
方法将子字符串转换成对应的数字。 -
处理
0
开头且实际不为0
的数字; -
num1
和num2
的长度应小于string
长度的一半。
在成功获取两个数之后,接下来就是计算在剩下的字符串中是否存在一个值等于先前两数之和 sum
。
若存在,则将 num1
更新为 num2
, num2
更新为 sum
,并重复上述过程;
若不存在,则重新获取 num1
和 num2
的值。
代码
JavaScript
/**
* @param {string} num
* @return {boolean}
*/
var isAdditiveNumber = function(num) {
for(let i = 1; i < num.length / 2; i++) {
if(num[0] === '0' && i > 1) {
return false;
}
for(let j = i + 1; j < num.length; j++) {
if(num[i] === '0' && j - i> 1 || (j - i) > num.length / 2) {
break;
}
let num1 = Number(num.substring(0, i));
let num2 = Number(num.substring(i, j));
if(isAdditiveNumberHelper(num.substring(j), num1, num2)) {
return true;
}
}
}
return false;
};
function isAdditiveNumberHelper(num, num1, num2) {
if(num.length === 0) {
return true;
}
for(let i = 1; i <= num.length; i++) {
if(num[0] === '0' && i > 1) {
return false;
}
let sum = Number(num.substring(0, i));
if(num1 + num2 === sum) {
return isAdditiveNumberHelper(num.substring(i), num2, sum);
} else if(num1 + num2 < sum) {
break;
}
}
return false;
}