306. 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.

For example:
"112358" is an additive number because 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

"199100199" is also an additive number, the additive sequence is: 1, 99, 100, 199.

1 + 99 = 100, 99 + 100 = 199

Note: Numbers in the additive sequence cannot have leading zeros, so sequence 1, 2, 03 or 1, 02, 3 is invalid.

Given a string containing only digits '0'-'9', write a function to determine if it's an additive number.

Follow up:
How would you handle overflow for very large input integers?

链接: http://leetcode.com/problems/additive-number/

题解:

求String是否是additive number。这里我们要用到递归。就是先取第一个单词和第二个单词,求出sum,再跟剩下字符串的首部进行比较,然后进行递归。还有很多pruning可以做,比如取num1和num2时只用遍历一半的字符,因为假如这两个的和超过了字符串长的一半,肯定不符合规定。 二刷要注意精炼代码。

Time Complexity - O(2n), Space Complexity - O(2n)

public class Solution {
    public boolean isAdditiveNumber(String num) {
        if(num == null || num.length() == 0) {
            return false;
        }
        
        for(int i = 1; i < num.length(); i++) {
            for(int j = i + 1; j < num.length(); j++) {
                String s1 = num.substring(0, i);
                String s2 = num.substring(i, j);
                if(isAdditiveNumber(s1, s2, num.substring(j))) {
                    return true;
                }
            }
        }
        
        return false;
    }
    
    private boolean isAdditiveNumber(String s1, String s2, String num) {
        if(num.length() == 0) {
            return true;
        }
        if((s1.length() > 1 && s1.charAt(0) == '0') || (s2.length() > 1 && s2.charAt(0) == '0')) {
            return false;
        }
        String sum = getSum(s1, s2);
        if(sum.length() > num.length() || !sum.equals(num.substring(0, sum.length()))) {
            return false;
        } else {
            return  isAdditiveNumber(s2, sum, num.substring(sum.length()));
        }        
    }
    
    public String getSum(String s1, String s2) {
        StringBuilder sb = new StringBuilder();
        int index1 = s1.length() - 1, index2 = s2.length() - 1;
        int carry = 0, newDigit = 0;
        while(index1 >= 0 || index2 >= 0) {
            int digitA = index1 >= 0 ? s1.charAt(index1) - '0' : 0;
            int digitB = index2 >= 0 ? s2.charAt(index2) - '0' : 0;
            newDigit = (digitA + digitB + carry) % 10;
            sb.insert(0, newDigit);
            carry = (digitA + digitB + carry) >= 10 ? 1 : 0;
            index1--;
            index2--;
        }
        if(carry == 1) {
            sb.insert(0, '1');
        }
        
        return sb.toString();
    }    
}

题外话:

今天家里修理gas range,修了一天,所以只做了一道题。修理工是一个多米尼加人,最后做的不太好,还要了$700,好气人啊....明天去吃Hakata Tonton,希望能在图书馆多做几道题目。

Reference:

https://leetcode.com/discuss/70124/0ms-concise-solution-perfectly-handles-the-follow-leading

https://leetcode.com/discuss/70102/java-recursive-and-iterative-solutions

https://leetcode.com/discuss/70119/backtracking-with-pruning-java-solution-and-python-solution

https://leetcode.com/discuss/71455/very-straightforward-solution-with-detailed-explanation

https://leetcode.com/discuss/70157/java-easy-understand-dfs

https://leetcode.com/discuss/70089/python-solution

https://leetcode.com/discuss/70796/simple-java-solution

https://leetcode.com/discuss/70123/my-simple-c-non-recursion-solution

https://leetcode.com/discuss/73387/elegant-0ms-backtracking-solution-in-c-with-explanation

原文地址:https://www.cnblogs.com/yrbbest/p/5053715.html