题目来源:力扣
题目介绍:
累加数是一个字符串,组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
给定一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是累加数。
说明: 累加序列里的数不会以 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
====================================
审题:
刚看到这道题,有点懵,后来在纸上写写画画,发现只要确定前两个数值,当前字符串的累加序列便也就唯一确定了,我们只需要判断该序列是否符合累加值要求.
判断一个序列是否符合累加值也较为简单,此处主要注意的是如果整数过大,使用int保存两数之和可能溢出,我在后面的实现中使用了Long来保存整数,但最安全的方法应当是使用字符串相加的方式计算两个大整数之和.
如果当前剩余字符串为空,判断完毕,则当前序列为累加序列,如果当前值a与值b相加的整数对应字符串长度大于剩余的字符串,则返回false, 如果当前值a与值b相加整数对应的字符串与值b的后续子字符串对应,则比较下一位.
java算法:
class Solution {
//确定前两个数字的可能值
private boolean dfs(String num, int aStart, int aEnd, int bEnd){
if(bEnd == num.length())
return true;
long first = Long.parseLong(num.substring(aStart, aEnd));
long second = Long.parseLong(num.substring(aEnd, bEnd));
String third = Long.toString(first + second);
if(third.length() > num.length() - bEnd) //如果剩余长度不足third长度,则返回false
return false;
else if(num.substring(bEnd, bEnd+third.length()).equals(third)) //如果相等,则继续下一步比较
return dfs(num, aEnd, bEnd, bEnd+third.length());
else{
return false;
}
}
private boolean judge(String num, int aStart, int aEnd, int bEnd){
while(bEnd < num.length()){
long first = Long.parseLong(num.substring(aStart, aEnd));
long second = Long.parseLong(num.substring(aEnd, bEnd));
String third = Long.toString(first + second);
if(third.length() > num.length() - bEnd) //如果剩余长度不足third长度,则返回false
return false;
else if(num.substring(bEnd, bEnd+third.length()).equals(third)){
//如果相等,则继续下一步比较
aStart = aEnd;
aEnd = bEnd;
bEnd = bEnd +third.length();
}
else //比较不相同
return false;
}
return true;
}
public boolean isAdditiveNumber(String num) {
for(int i = 1; i <= num.length() - 2; i++){
for(int j = 1; j <= num.length() - i - 1 ; j++){
if(num.charAt(0) == '0' && i > 1)
continue;
if(num.charAt(i) == '0' && j > 1)
continue;
if(judge(num, 0, i, i+j))
return true;
}
}
return false;
}
}
注:
dfs()
函数为递归地判断一个字符串是否是累加字符串的方法,由于该递归为尾递归,因此可容易地转化为迭代方法judge()
.