题目:

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

306. Additive Number的更多相关文章

  1. [LeetCode] 306. Additive Number [Medium]

    306. Additive Number class Solution { private: string stringAddition(string &a, string &b) { ...

  2. 【LeetCode】306. Additive Number 解题报告(Python)

    [LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...

  3. Leetcode 306. Additive Number

    Additive number is a string whose digits can form additive sequence. A valid additive sequence shoul ...

  4. 【LeetCode】306. Additive Number

    题目: Additive number is a string whose digits can form additive sequence. A valid additive sequence s ...

  5. 306 Additive Number 加法数

    Additive number is a string whose digits can form additive sequence.A valid additive sequence should ...

  6. 【刷题-LeetCode】306. Additive Number

    Additive Number Additive number is a string whose digits can form additive sequence. A valid additiv ...

  7. LeetCode(306) Additive Number

    题目 Additive number is a string whose digits can form additive sequence. A valid additive sequence sh ...

  8. [LeetCode] Additive Number 加法数

    Additive number is a positive integer whose digits can form additive sequence. A valid additive sequ ...

  9. Additive Number

    Additive number is a string whose digits can form additive sequence. A valid additive sequence shoul ...

随机推荐

  1. SPA examples

    http://webdesignledger.com/inspiration/40-excellent-examples-of-single-page-websites https://onepage ...

  2. shell基本语法备忘

    1.第一行要写明shell种类 #!/bin/bash   2.打印输出 #!/bin/bashecho "Hello World !~"   3.变量定义 变量=前后不能有空格, ...

  3. Phantom omini设备开发流程

    最近在忙着做毕业设计,我的毕业设计是做力觉临场感的,所以在力反馈设备Phantom Omini,由于整个设备是国外的国内的资料很少,我是14年拿到这个设备的但是真的是在开发是在16年了,中间有很多事没 ...

  4. android 下载图片出现SkImageDecoder::Factory returned null,BitmapFactory.Options压缩

    网上有很多说是因为没有采用HttpClient造成的,尼玛,我改成了HttpClient 请求图片之后还是会出现SkImageDecoder::Factory returned null, 但是直接使 ...

  5. DOM中事件绑定补充方法

    先将上一篇文章中提到的为元素增加事件的方法和移除事件的方法拿过来: <span style="font-size:18px;">//跨浏览器添加事件 function ...

  6. HDU 2196 求树上所有点能到达的最远距离

    其实我不是想做这道题的...只是今天考试考了一道类似的题...然后我挂了... 但是乱搞一下还是有80分....可惜没想到正解啊! 所以今天的考试题是: 巡访 (path.pas/c/cpp) Cha ...

  7. 【BZOJ】【2565】最长双回文串

    Manacher算法 找出一个最长子串S=X+Y,且X和Y都是回文串,求最长的长度是多少…… 同时找两个串明显很难搞啊……但是我们可以先找到所有的回文串!在找回文串的同时我们可以预处理出来l[i]和r ...

  8. 【BZOJ】【3831】【POI2014】Little Bird

    DP/单调队列优化 水题水题水题水题 单调队列优化的线性dp…… WA了8次QAQ,就因为我写队列是[l,r),但是实际操作取队尾元素的时候忘记了……不怎么从队尾取元素嘛……平时都是直接往进放的……还 ...

  9. 重定向 vs output redirect

    http://asawicki.info/files/visual_cpp_redirect.png http://asawicki.info/news_1496_redirecting_output ...

  10. setTimeout(f, 0)的应用&利用Deferred实现队列运行

    任务:从mongodb中导出csv数据,输出内容如下userid username usergender points points表: { "userid" : 1022, &q ...