累加数是一个字符串,组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
给定一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是累加数。
说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/additive-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public boolean isAdditiveNumber(String num) {
if(num==null || num.length()<3) return false;
for(int i=1;i<=num.length();i++){
String num1 = num.substring(0,i);
if(num1.charAt(0)=='0' && num1.length()>1){
continue;//去除前导0
}
for(int j=i+1;j<num.length();j++){
String num2 = num.substring(i,j);
if(num2.charAt(0)=='0' && num2.length()>1){
continue;//去除前导0
}
long val1 = Long.valueOf(num1);
long val2 = Long.valueOf(num2);
boolean flag = dfs(num,j,val2,val1+val2);
if(flag) return true;
}
}
return false;
}
/*
* index代表在num中的下标值
* pre代表上一个操作数
* value代表前两个操作数相加的目标值
*/
public boolean dfs(String num, int index, long pre, long value){
if(index==num.length()) return true;
for(int i=index;i<num.length();i++){
String temp = num.substring(index,i+1);//截取两数相加后的值
if(temp.charAt(0)=='0' && temp.length()>1) continue;//去除前导0
long val = Long.valueOf(temp);
if(val<value){
continue;
} else if(val==value){
return dfs(num,i+1,val,pre+val);
}else{
return false;
}
}
return false;
}
}