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

Constraints:

  • num consists only of digits '0'-'9'.
  • 1 <= num.length <= 35

Follow up:

How would you handle overflow for very large input integers?

  • 回溯法。注意回溯中,在进入分支之后,还要退出分支
  • 大数运算。用字符串实现大数的加减乘除
// 大数,只需要重载加法
class BigNum{
public:
string val;
BigNum(string s, bool hasreversed = false){
if(!hasreversed){
reverse(s.begin(), s.end());
}
val = s;
}
void Print(){
for(int i = val.size()-1; i>=0; --i)cout << val[i];
cout << endl;
}
//先加两个字符串公有的部分,再加上剩下的部分
//如果进位不为0,还要加上进位
BigNum operator + (BigNum &b){
string s1 = b.val, res;
int carry = 0, i = 0;
while(i < s1.size() && i < val.size()){
int tmp = carry + (s1[i]-'0') + (val[i]-'0');
carry = tmp / 10;
res += tmp % 10 + '0';
i++;
}
while(i < s1.size()){
int tmp = carry + (s1[i]-'0');
carry = tmp / 10;
res += tmp % 10 + '0';
i++;
}
while(i < val.size()){
int tmp = carry + (val[i]-'0');
carry = tmp / 10;
res += tmp % 10 + '0';
i++;
}
if(carry)res += carry + '0';
return BigNum(res, true);
}
}; class Solution {
public:
bool isAdditiveNumber(string num) {
vector<BigNum>path;
return dfs(num, 0, path);
}
bool dfs(string &num, int pos, vector<BigNum>&path){
//结束条件,当pos到达了字符串末尾,则枚举完毕,看path的长度,如果大于2,说明前面的枚举是成功的
if(pos >= num.size())return path.size() >= 3;
int len = path.size();
// 如果len<2,说明最前面的两个数字还没有选出来,枚举选择即可
// 不能出现前缀0,即02 00这些是不合法的,只能选成0
if(len < 2){
for(int i = 1; i <= num.size(); ++i){
if(num[0] == '0' && i > 1)break;
path.push_back(BigNum(num.substr(0, i)));
for(int j = i+1; j <= num.size(); ++j){
if(num[i] == '0' && j > i + 1)break;
path.push_back(BigNum(num.substr(i, j-i)));
if(dfs(num, j, path)){
return true;
}else{
path.pop_back();
}
}
path.pop_back();
}
}else{
// 算出前两个数字的和,看对应的字符串是不是num的子串,不是的话返回,是的话往后搜索
BigNum next_int = path[len-2] + path[len-1];
string next_str = next_int.val;
reverse(next_str.begin(), next_str.end());
if(num.substr(pos, next_str.size()) == next_str){
path.push_back(next_int);
bool res = dfs(num, pos + next_str.size(), path);
path.pop_back();
return res;
}else{
return false;
}
}
return false;
}
};

【刷题-LeetCode】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

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

  3. 【刷题-LeetCode】200 Number of Islands

    Number of Islands Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. ...

  4. 【刷题-LeetCode】191 Number of 1 Bits

    Number of 1 Bits Write a function that takes an unsigned integer and return the number of '1' bits i ...

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

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

  6. 【LeetCode】306. Additive Number

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

  7. 306. Additive Number

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

  8. 306 Additive Number 加法数

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

  9. LeetCode刷题------------------------------LeetCode使用介绍

    临近毕业了,对技术有种热爱的我也快步入码农行业了,以前虽然在学校的ACM学习过一些算法,什么大数的阶乘,dp,背包等,但是现在早就忘在脑袋后了,哈哈,原谅我是一枚菜鸡,为了锻炼编程能力还是去刷刷Lee ...

随机推荐

  1. Linux使用docker部署nacos

    官网地址:https://nacos.io/zh-cn/docs/quick-start-docker.html 先把sql文件导入到mysql中 我也放了基础的sql /* * Copyright ...

  2. JAVA实现返回0001,0002,0003格式数字

    这里只需要修改 %04d 中的4即可设置生成几位数 /** * 获取下一个编号 * @param startValue 上一个编号 * @return */ public static String ...

  3. C语言读写二进制文件

    fseek用法 fseek用来移动文件指针.函数原型 int fseek(FILE * stream, long offset, int fromwhere); 参数解释: stream 是文件流指针 ...

  4. c++设计模式概述之状态

    代码写的不够规范,目的是为了缩短篇幅,实际中请不要这样做 参看:https://www.runoob.com/design-pattern/state-pattern.html 1.概述 这个有点抽象 ...

  5. 【LeetCode】383. Ransom Note 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 [LeetCo ...

  6. 【LeetCode】458. Poor Pigs 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. WPF中的StaticResource和DynamicResource有什么区别

    StaticResource 是静态资源 DynamicResource是动态资源 用一下例子说明 <Window.Resources> <Style x:Key="Bor ...

  8. 51Nod 1264:线段相交(计算几何)

    51Nod 1264:线段相交 Decision 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交,输出"Yes",否则输出&q ...

  9. python语法糖之有参装饰器、无参装饰器

    python的装饰器简单来说就是函数的一种形式,是为了扩展原来的函数功能而设计的. 装饰器的特别之处在于它的返回值也是一个函数,可以在不改变原有函数代码的基础上添加新的功能 # 先定义一个函数及引用# ...

  10. BeanUtils属性转换工具

    commons 包的 BeanUtils 进行属性拷贝性能较差:Spring 的 BeanUtils 性能相对较好. public class A { private String name; pri ...