LeetCode:累加数【306】
LeetCode:累加数【306】
题目描述
累加数是一个字符串,组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 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
进阶:
你如何处理一个溢出的过大的整数输入?
题目分析
累加数是一个由一组数字拼合成的字符串,除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
采用的方式还是递归回溯框架。这道题涉及的一个重要问题是怎么把数字从字符串中划分出来,再没有更好的方法前,我们只能把所有的可能性提取出来。
public void DFS(List<List<Integer>> ans,String str,List<Integer> list,int start){//递归结束条件if(list.size()==3){ans.add(new ArrayList<>(list));return;}//业务逻辑处理for(int i=start;i<str.length();i++){String part = str.substring(start,i+1);list.add(Integer.valueOf(part));DFS(ans,str,list,i+1);list.remove(list.size()-1);}}
但是这里我们改变一下,因为我们并不需要保存所有的结果,我们要验证是否存在从第三个数字开始的数字是前否是两个数字的和,所以前两个数字我们是要需要考虑所有的情况的,但是接下来的数字我们要看是否是前两个数字的和,即前两个数字的所有可能性的和中是否存在于接下来的字符串里面。所以当我们list的尺寸是大于2开始要进行分支判断。
public boolean DFS(String str,List<Integer> list,int start){//递归结束条件if(start==str.length()){//如果小于三的话,说明无法找到第三个数是前两个数的和,这样的返回是false。return list.size()>2;}//找到第一个数的情况下,找第二个数if(list.size()<2){for(int i=start;i<str.length();i++){String part = str.substring(start,i+1);list.add(Integer.valueOf(part));if(DFS(str,list,i+1))return true;list.remove(list.size()-1);}}//从第三个数开始要判断是否是前两个数字的和else{Integer nextVal = list.get(list.size()-1)+list.get(list.size()-2);String next = String.valueOf(nextVal);if(str.substring(start).startsWith(next)){list.add(nextVal);if(DFS(str,list,start+next.length()))return true;list.remove(list.size()-1);}}return false;}
}
这样只有在所有路径都跑完了以后无论可走的情况下,最后才会返回false,只要有一个条路径走通就会返回true。但是最后通过了自定义样例,还是无法AC,原因在于我们没有考虑处理大数的问题,所以这里的Integer要换成BigInteger。
Java题解
public boolean isAdditiveNumber(String num) {return helper(num, new ArrayList<BigInteger>());}public boolean helper(String remain, List<BigInteger> cur){if(remain.length()==0)return cur.size()>=3;if(cur.size()<2){for(int i=0;i<remain.length();i++){String part =remain.substring(0,i+1);if(part.length()>1&&part.startsWith("0"))continue;cur.add(new BigInteger(part));if(helper(remain.substring(i+1),cur))return true;cur.remove(cur.size()-1);}}else {BigInteger nextVal = cur.get(cur.size()-1).add(cur.get(cur.size()-2));String next = String.valueOf(nextVal);if(remain.startsWith(next)){cur.add(nextVal);if(helper(remain.substring(next.length()),cur))return true;cur.remove(cur.size()-1);}}return false;}
转载于:https://www.cnblogs.com/MrSaver/p/9974299.html
LeetCode:累加数【306】相关推荐
- Python|Leetcode《306》|累加数
专栏<LeetCode|一刷到底> 打卡每天leetcode精选每日一题(尽量不断更!) 点击关注不迷路!!! 一.题目描述 题目:累加数 难度:中等 地址:<306>累加数 ...
- Java实现 LeetCode 306 累加数
306. 累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ...
- [Leetcode] 第306题 累加数
一.题目描述 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ' ...
- leetcode 306 累加数(js)
题目描述 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0' ...
- 编写一个函数实现从 1 到 n 共 n 个数的累加_leetcode306_go_累加数
题目 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'-' ...
- 累加数Python解法
累加数 是一个字符串,组成它的数字可以形成累加序列. 一个有效的 累加序列 必须 至少 包含 3 个数.除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和. 给你一个只包含数字 '0 ...
- leetcode 306. Additive Number | 306. 累加数(Java)
题目 https://leetcode.com/problems/additive-number/ 题解 看来不只有我想喷这道题.. 思路很朴素,代码写的太矬了,注释写在代码里了. 真的想看过程的话, ...
- leetcode2021年度刷题分类型总结(三)回溯法 (python)
主要参考:代码随想录 分为三个部分对回溯法进行总结 1.组合 例一:77. 组合 组合问题关键在于[1,4]和[4,1]算作重复答案,也即取数时往前推进,取到4时不能回头取1,所以每次都要记录取到的位 ...
- C# LeetCode刷题 - Leetcode 306. 累加数 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- C#版 - Leetcode 306. 累加数 - 题解
C#版 - Leetcode 306. 累加数 - 题解 306.Additive Number 在线提交: https://www.gaimor.cn 累加数是一个字符串,组成它的数字可以形成累加序 ...
最新文章
- List集合add方法覆盖原来的内容解决办法
- dlopen failed: library “libopencv_java4.so“ not found 解决
- angular2的模板语法
- 第14课:项目实战——深度优化你的神经网络模型
- 洛谷 P2695 骑士的工作
- 自定义类在PropertyGrid上的展示方法
- [复习]莫比乌斯反演,杜教筛,min_25筛
- LeetCode 663. 均匀树划分(树形DP)
- jq获取当前完整html,jquery怎样获取html的内容?
- 少年,你知道怎么用一行代码解决分布式事务问题吗?
- 未使用调试信息生成二进制文件_Visual Studio IDE 编译,调试 保存 使用
- 程序员打字练习_程序员必须来看的面试圣经!!
- 嵌入式-C语言常见面试/笔试题
- [HTTP协议] 基础知识
- 练字在现代社会的意义还大不大,尤其是电脑普及的情况下,花费大量的时间去练字还值得么?
- Eviews下载及安装
- DS4Windows(电脑PS4手柄控制器)v2.2.6 中文版
- XTU 1236 Fibonacci
- 打开蓝牙来允许”xxx”连接到配件
- android浏览器!6年菜鸟开发面试字节跳动安卓研发岗,大厂面经合集
热门文章
- 【Hoxton.SR1版本】Spring Cloud Gateway之GlobalFilter全局过滤器
- Java集合相关面试题总结
- Android 在 Fragment 中使用 getActivity() NullPointException 的思考和解决办法
- Juniper SSG20 Config DHCP Server
- visual studio for mac在线安装网络错误
- Apache Spark技术实战之5 -- SparkR的安装及使用
- [2018.07.10 T2]不回文
- 项目中一些零碎化总结的
- 前端性能优化(慕课网笔记)-4-资源的优化
- break 退出循环