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;
}

LeetCode:累加数【306】的更多相关文章

  1. Java实现 LeetCode 306 累加数

    306. 累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ...

  2. Leetcode 306.累加数

    累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'- ...

  3. [Leetcode] 第306题 累加数

    一.题目描述 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ' ...

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

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

  5. C#LeetCode刷题-回溯算法

    回溯算法篇 # 题名 刷题 通过率 难度 10 正则表达式匹配   18.8% 困难 17 电话号码的字母组合   43.8% 中等 22 括号生成   64.9% 中等 37 解数独   45.8% ...

  6. leetcode-累加数(C++)

    累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 '0'-'9'  ...

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

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

  8. 【高速接口-RapidIO】5、Xilinx RapidIO核例子工程源码分析

    提示:本文的所有图片如果不清晰,请在浏览器的新建标签中打开或保存到本地打开 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:Vivado2015.4.2 ...

  9. 5.Xilinx RapidIO核例子工程源码分析

    https://www.cnblogs.com/liujinggang/p/10091216.html 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:V ...

随机推荐

  1. Azkaban安装配置

    描述: azkaban主要用于离线计算任务的调度 说明: 此处Azkaban选择版本为:3.52.0,部署方式为Cluster模式,即支持多Executor计算节点,目前默认安装方式选择在同一台机器上 ...

  2. Expectation Maximization(EM)算法note

    EM算法,之前上模式识别课上,推导过,在<统计学习方法>中没耐性的看过几次,个人感觉讲的过于理论,当时没怎么看懂,后来学lda,想要自己实现一下em算法,又忘记了,看来还是学的不够仔细,认 ...

  3. edmx

  4. Using Fast Weights to Attend to the Recent Past

    Ba, Jimmy, et al. "Using Fast Weights to Attend to the Recent Past." Advances In Neural In ...

  5. bootstrap随笔点击增加

          ht5:   <div class="form-group"><label class="col-sm-2 control-label&qu ...

  6. 【转】VC++的Unicode编程

    转自http://www.cnblogs.com/kex1n/archive/2010/03/15/2286510.html 原始出处http://www.vckbase.com/document/v ...

  7. 蓝桥杯 第四届C/C++预赛真题(5) 前缀判断(水题)

    题目标题:前缀判断 如下的代码判断 needle_start指向的串是否为haystack_start指向的串的前缀,如不是,则返回NULL. 比如:"abcd1234" 就包含了 ...

  8. Java中带包的类的编译与执行

    http://blog.csdn.net/wbrs13/article/details/4859880

  9. phpstorm 内存设置

    https://blog.csdn.net/qq_33862644/article/details/81938970

  10. Java安全API

    java提供了完整的密码学API,我们可以结合密码学相关的概念来系统的学习这些API. 1.密码学简介(crypto) 密码学通俗来说就是研究如何对信息进行加密和破密,如果不是专门研究信息安全,通常我 ...