306. 累加数

累加数 是一个字符串,组成它的数字可以形成累加序列。

一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。

给你一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。

说明:累加序列里的数 不会 以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/additive-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.math.BigInteger;
import java.util.Scanner;

class Solution {
    public boolean isAdditiveNumber(String num) {
        if (num == null || num.length() == 0) {
            return false;
        }

        BigInteger first = BigInteger.ZERO;

        for (int i = 0; i < num.length(); ++i) {
            if (i == 1 && num.charAt(0) == '0') {
                break;
            }
            first = first.multiply(BigInteger.TEN).add(BigInteger.valueOf(num.charAt(i) - '0'));
            BigInteger second = BigInteger.ZERO;
            for (int j = i + 1; j < num.length(); ++j) {
                if (j == i + 2 && num.charAt(i + 1) == '0') {
                    break;
                }
                second = second.multiply(BigInteger.TEN).add(BigInteger.valueOf(num.charAt(j) - '0'));


                BigInteger a = first;
                BigInteger b = second;

                int k = j + 1;

                while (k < num.length()) {
                    BigInteger c = a.add(b);


                    String str = c.toString();

                    if (str.length() > num.length() - k) {
                        break;
                    }

                    boolean ok = String.valueOf(num.toCharArray(), k, str.length()).equals(str);

                    if (ok) {
                        a = b;
                        b = c;
                        k = k + str.length();
                        if (k == num.length()) {
                            return true;
                        }
                    } else {
                        break;
                    }
                }


            }
        }
        return false;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            System.out.println(new Solution().isAdditiveNumber(in.next()));
        }
    }
}
posted @ 2022-01-04 21:44  Tianyiya  阅读(71)  评论(0)    收藏  举报