累加数是一个字符串,组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
给定一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是累加数。
说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
示例 1:
输入: "112358"输出: true
解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
示例 2:
输入: "199100199"输出: true
解释: 累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199
进阶:
你如何处理一个溢出的过大的整数输入?
 
思路:两个for循环获得初始的3个数,当我们探索下去这三个数不成立的话,可以通过For循环增大位数,继续比较下去,如果出现了比较成立,直接返回True。
在比较这三个数,探索的情况下,我们用DFS来处理。获得的三个数,num1+num2==num3.substr,因此DFS也要不断更新num1,num2,num.substr。
注意到如果首位为“0”  那么要跳过。
我们是通过字符串来比较三个数的,因此再写一个字符串整数相加的算法。(字符串相加为大整数运算,同时解决了溢出问题)
class Solution {
public:
string getSum(string& num1,string& num2){ //两个字符串表示的数字相加的算法,最后返回一个字符串sum
int val,flag=,len1=num1.size(),len2=num2.size();
string sum;
while(len1||len2){ //字符串相加,从个位数到百位,千位,万位
int val=; //每一位数的和
if(len1>) {val+=num1[len1-]-''; len1--;}
if(len2>){val+=num2[len2-]-''; len2--;}
sum+=to_string((val+flag)%);
flag=(val+flag)/;
}
if(flag)sum+=""; //最后的进位要加上去
reverse(sum.begin(),sum.end());
return sum;
}
bool dfs(string& num1,string& num2,string& num3){ //num1,num2相加是否等于后面的数字,同时探索到最后一个数字
if(num3.size()==)return true;
string sum=getSum(num1,num2);
for(int i=;i<=num3.size();i++){
string str=num3.substr(,i), tem=num3.substr(i);
if(str==sum&&dfs(num2,sum,tem))return true; //三个数字分别为num2,sum,tem
if(num3[]=='')break; //"0"在首位那么跳过
}
return false;
}
bool isAdditiveNumber(string num) {
if(num.size()<)return false;
int size=num.size();
for(int i=;i<size-;i++){
string num1=num.substr(,i); //先获得三个数字,i从1开始,就是获得三个个位数
for(int j=i+;j<size;j++){
//c++的substr函数是string.substr(index,len) len表示切割的长度。 如s=“0123456" s.substr(4)="456"
string num2=num.substr(i,j-i);
string num3=num.substr(j);
if(dfs(num1,num2,num3))return true;
if(num[i]=='')break;
}
if(num[]=='')break;
}
return false;
} };

leetcode-累加数(C++)的更多相关文章

  1. C#版 - Leetcode 306. 累加数 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  2. [Swift]LeetCode306. 累加数 | Additive Number

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

  3. LeetCode 三数之和 — 优化解法

    LeetCode 三数之和 - 改进解法 题目:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复 ...

  4. 【数据结构】Hash表简介及leetcode两数之和python实现

    文章目录 Hash表简介 基本思想 建立步骤 问题 Hash表实现 Hash函数构造 冲突处理方法 leetcode两数之和python实现 题目描述 基于Hash思想的实现 Hash表简介 基本思想 ...

  5. Leetcode 1577 数的平方等于两数乘积的方法数

    Leetcode 1577 数的平方等于两数乘积的方法数 题目 给你两个整数数组 nums1 和 nums2 ,请你返回根据以下规则形成的三元组的数目(类型 1 和类型 2 ): 类型 1:三元组 ( ...

  6. [LeetCode]丑数 II&C++中priority_queue和unordered_set的使用

    [LeetCode]丑数 II&C++中priority_queue和unordered_set的使用 考虑到现实因素,LeetCode每日一题不再每天都写题解了(甚至有可能掉题目?--)但对 ...

  7. LeetCode两数之和

    LeetCode 两数之和 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是 ...

  8. python LeetCode 两数相除

    近一个月一直在写业务,空闲时间刷刷leetcode,刷题过程中遇到了一道比较有意思的题目,和大家分享. 题目描述: 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使 ...

  9. [LintCode/LeetCode]——两数和、三数和、四数和

    LintCode有大部分题目来自LeetCode,但LeetCode比较卡,下面以LintCode为平台,简单介绍我AC的几个题目,并由此引出一些算法基础. 1)两数之和(two-sum) 题目编号: ...

  10. LeetCode.1175-质数排列(Prime Arrangements)

    这是小川的第413次更新,第446篇原创 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第264题(顺位题号是1175).返回1到n的排列数,以使质数处于质数索引(索引从1开始).(请 ...

随机推荐

  1. TestNG注解使用技巧 - @Factory

    之前在测试中一直使用testNG的@Test注解都很顺利没有碰到什么问题,今天突然遇到@Test不能用的情况,运行后提示: org.testng.TestNGException: Can't invo ...

  2. 作为测试新手,web测试从何开始学起?

    我们先来弄清楚web测试的测试范围,通常web测试包含:功能测试.性能测试.浏览器兼容测试.安全测试以及用户界面测试等.那么,作为一个初级测试员或者实习测试员,最开始的能做的只能是功能测试和用户界面测 ...

  3. java bitSet简单使用

    package Contain; import java.util.BitSet; public class MyBitset { public static void main(String[] a ...

  4. HTML5前端性能优化——浏览器兼容与前端性能优化

    一.浏览器兼容 1.1.概要 世界上没有任何一个浏览器是一样的,同样的代码在不一样的浏览器上运行就存在兼容性问题.不同浏览器其内核亦不尽相同,相同内核的版本不同,相同版本的内核浏览器品牌不一样,各种运 ...

  5. Linux -- 用户组篇

    Linux -- 用户与用户组 1.Linux 系统中有三种角色:所有者(用户),用户组与其他人,一张图可以说明用户与用户组的关系. 如图,某公司相当于一个用户组,该用户组下有A,B两个用户,用户拥有 ...

  6. Oracle 触发器(二)

    Oracle触发器详解   触发器是许多关系数据库系统都提供的一项技术.在oracle系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 8.1 触发器类型 触发器在数据库里 ...

  7. RAC Cache Fusion Background Processes

    Acdante--每日三省吾身-- . 什么是缓存融合? .缓存融合工作原理? .缓存融合关键进程以及作用?

  8. 深入理解bit_or和bit_and,bit_count

    bit_or:二进制数按位或,bit_and:二进制数按位与,bit_count:统计二进制数1个个数 下面以一个例子来说明用法:示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里.1234 ...

  9. MySQL语句整理(二)

    数据库操作前的准备 -- 创建数据库 -- create database python_test_1 charset=utf8; -- 使用数据库 -- use python_test_1; -- ...

  10. Python 爬虫 (一)

    爬: 爬一个网站需要几步? 确定用户的需求 根据需求,寻找网址 读取网页 urllib request requests 定位并提取数据 正则 xpath beautiful soup 存储数据 my ...