累加数是一个字符串,组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 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. localtunnel内网服务器暴露至公网

    摘自@scarlex   1.安装 npm install -g localtunnel 2.运行 lt --port 8080  (your url is: http://xxxx.localtun ...

  2. vue使用iview Timeline 时间轴不显示问题

    vue Timeline 时间轴不显示渲染的效果 官网代码 <Timeline pending> <TimelineItem>发布1.0版本</TimelineItem& ...

  3. 【译】2分钟介绍Rx

    原文地址:https://medium.com/@andrestaltz/2-minute-introduction-to-rx-24c8ca793877 翻译去掉了一些口水话(⊙o⊙) 诸位应该已经 ...

  4. chromium之histogram.h

    histogram不知道是干啥的 // Histogram is an object that aggregates statistics, and can summarize them in // ...

  5. PHP的抽象类和抽象方法以及接口总结

    PHP中的抽象类和抽象方法自己用的不多,但是经常会在项目中看到别人使用,同样,今天在看别人的代码的时候,发现使用了抽象类,就总结下: 抽象类:1.如果一个类中有一个方法是抽象方法,则这个类就是抽象类: ...

  6. 32位ubuntu16.04桌面版系统安装

    1.下载并安装UltraISO软件安装之后插入U盘 2.然后打开软件点击文件打开找到下载的Ubuntu的ISO文件双击打开完成ISO文件的加载 3.点击启动选项(记得点开加载后的镜像,使之展开如图) ...

  7. Elasticsearch 数据操作

    一.新增数据 1.1 随机生成id 语法: POST /索引库名/类型名 { "key1": "value1", "key2": " ...

  8. ruby语言里的self理解

    关键的一句话:关键看谁调用self,self就属于谁 有3种情况: 1.在class或module的定义中,self代表这个class或者这个module对象,代码如下: class S puts ' ...

  9. win10 禁用自动更新

    管理员身份运行CMD,输入REG add "HKLM\SYSTEM\CurrentControlSet\Services\UsoSvc" /v "Start" ...

  10. go包管理工具glide使用方法

    golang没有官方最佳管理方案,在go的世界里存在大量的自制解决方案. go语言的包是没有中央库统一管理的,通过使用go get命令从远程代码库(github.com,goolge code 等)拉 ...