分析
难度 中
来源 https://leetcode.com/problems/additive-number/
题目
Additive number is a string whose digits can form additive sequence.
A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two.
Given a string containing only digits ‘0’-‘9’, write a function to determine if it’s an additive number.
Note: Numbers in the additive sequence cannot have leading zeros, so sequence 1, 2, 03 or 1, 02, 3 is invalid.
Example 1:
Input: “112358”
Output: true
Explanation: The digits can form an additive sequence: 1, 1, 2, 3, 5, 8.
1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
Example 2:
Input: “199100199”
Output: true
Explanation: The additive sequence is: 1, 99, 100, 199.
1 + 99 = 100, 99 + 100 = 199
Follow up:
How would you handle overflow for very large input integers?
解答
Runtime: 1 ms, faster than 95.87% of Java online submissions for Additive Number.
Memory Usage: 35.4 MB, less than 55.00% of Java online submissions for Additive Number.
package LeetCode;
public class L306_AdditiveNumber {
private boolean isAdditiveNumber(String num,long num1,long num2){
System.out.println("\t"+num1+"\t"+num2);
long sum=num1+num2;
String sumStr=String.valueOf(sum);
if(num.startsWith(sumStr)) {
if(sumStr.equals(num))
return true;
else
return isAdditiveNumber(num.substring(sumStr.length()), num2, sum);
}
return false;
}
public boolean isAdditiveNumber(String num){
long temp1,temp2;
int len=num.length();
if(num.length()<3)
return false;
for(int i=1;i<=num.length()/2;i++)
{
System.out.println("i:"+i);
if(num.charAt(0)=='0'&&i>1)//i>1即第一个数位数>=2且以0开头
return false;
temp1=Long.valueOf(num.substring(0,i));
for(int j=i+1;j<=Math.min(len-i,(len+i)/2);j++){//len-j>=i&&len-j>=j-i
System.out.println("\tj:"+j);
if(num.charAt(i)=='0'&&j-i>=2)//个位数的话,可以为2;多位数的话,不能以2开头。下同
break;
if(num.charAt(j)=='0'&&len-j>=2)
continue;
temp2=Long.valueOf(num.substring(i,j));
if(isAdditiveNumber(num.substring(j),temp1,temp2))
return true;
}
}
return false;
}
public static void main(String[] args){
L306_AdditiveNumber l306=new L306_AdditiveNumber();
//String num="112358";//true
//String num="199100199";//true
//String num="101";//true
String num="000";//true
System.out.println(l306.isAdditiveNumber(num));
}
}