累加数是一个字符串,组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 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;
} };

最新文章

  1. SQL基础语法(三)
  2. 配置 Windows 下的 nodejs C++ 模块编译环境
  3. bootstrap实现嵌入的button
  4. AWS CloudFront CDN直接全站加速折腾记The request could not be satisfied. Bad request
  5. ubuntu 安装配置ssh
  6. Shell displays color output
  7. ajax中的application/x-www-form-urlencoded中的使用
  8. Java基础-字面值
  9. recursion lead to out of memory
  10. Ubuntu环境下Nutch+Tomcat 搭建简单的搜索引擎
  11. 强强合体:Docker版Kali Linux发布
  12. 恢复被误操作删除的数据 fn_dblog
  13. echarts 折线柱形上方显示自定义格式数据
  14. C++断言assert
  15. defgen工具
  16. EF操作扩展之async
  17. 【52ABP实战教程】00-- ASP.NET CORE系列介绍
  18. 三、Snapman多人协作电子表格之——软件的基本功能
  19. font-family
  20. 10个用Console来Debug的高级技巧

热门文章

  1. Jmeter--JDBC请求(sqlserver)
  2. android:windowSoftInputMode属性详解 软键盘
  3. Entity Freamwork CodeFirst 连接PostgreSql数据库
  4. 用js写三个数,让三个数从小到大排列
  5. 解决Windows10下小娜无法搜索本地应用的问题
  6. 使用 jTessBoxEditor 生成 tesseract-orc 的字典
  7. Java5~11新特性
  8. 关于js代码位置的第一次总结
  9. JQuery制作网页—— 第六章 jQuery选择器
  10. 关于“CheckBox”通过表单提交的问题