题目:

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. ASCII码排序

    ASCII码排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符.   输入 第一行输 ...

  2. cnblogs体验

    用博客园可以让我更好的关注我们班同学的情况,通过关注他们,浏览他们发布的博客,学习到了很 多,比如不同的设计思想,良好的变成习惯,变量命名,缩进,注释等,而且自己不会的,可以帮助自己 有一些想法,是自 ...

  3. Alt.js的入门

    一.什么是Alt altJS是基于Flux使用Javascript应用来管理数据的类库,它简化了flux的store.actions.dispatcher. 关于Flux,以下链接都做了很好的诠释 h ...

  4. htaccess 探秘

    .htaccess访问控制(Allow/Deny) 1. 验证是否支持.htaccess 在目录下新建一个.htaccess 文件,随笔输入一串字符(毫无意义),看看什么反应,如果是500错误,说明目 ...

  5. hdu 3123 GCC 阶乘

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3123 The GNU Compiler Collection (usually shortened t ...

  6. Project Facets中Dynamic Web Module无法设置2.5的解决方法

    为什么将jre改到1.6,还是无法改变dynamic web module 到2.5啊 解决方法: 在工程目录下有一个.settings文件夹,打开org.eclipse.wst.common.pro ...

  7. Dynamic Programming - Part2

    实现如下: public static void main(String[] args) { String squence1 = "ABCBDAB"; String squence ...

  8. Android本地服务

    一.服务生命周期总结 (一).单独开启服务,并没有绑定服务Activity中调用startService(),服务的lifecycle:onCreate()→onStartCommand()→onSt ...

  9. Poj 1029 分类: Translation Mode 2014-04-04 10:18 112人阅读 评论(0) 收藏

    False coin Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16418   Accepted: 4583 Descr ...

  10. noi2006day2_最大获利 网络流

    这道题是上一题的数据加强版,dinic表示毫无压力: #include<iostream> #include<cstdio> #include<cstring> # ...