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. springbatch操作DB

    一.需求分析 使用Spring Batch对DB进行读写操作: 从一个表中读取数据, 然后批量的插入另外一张表中. 二.代码实现 1. 代码结构图: 2. applicationContext.xml ...

  2. C++ STL标准模板库(stack)

    //stack的使用 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<stack> using name ...

  3. 关于JSP生命周期的叙述,下列哪些为真?

    关于JSP生命周期的叙述,下列哪些为真? A.JSP会先解释成Servlet源文件,然后编译成Servlet类文件 B.每当用户端运行JSP时,jspInit()方法都会运行一次 C.每当用户端运行J ...

  4. 类加载器(ClassLoader)

    静态库.动态连接库 程序编制一般需经编辑.编译.连接.加载和运行几个步骤.在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件:在连接步骤中,连接器将从库文件取得所需的代码,复制 ...

  5. PHP 中 json_encode中文处理、urlencode方法、post中文乱码

    当使用php自带的json_encode对数据进行编码时,中文都会变成unicode,导致不可读.如:对字符串”厦门“进行json_encode后,输出的是"\u53a6\u95e8&quo ...

  6. js和jquery获取父级元素、子级元素、兄弟元素的方法{转}

    先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当成DOM元素   原生的 ...

  7. mybatis总结(二)

    实现简单的crud,上一节已经进行最简单的查询 这次在oracle数据库中操作,就在oracle实例中操作,分别是Dept表和Emp表,所以配置文件需要改动. 1.实体类 Dept类 public c ...

  8. java集合 stream 相关用法(1)

    java8新增一种流式数据,让操作集合数据更简单方便. 定义基本对象: public class Peo { private String name; private String id; publi ...

  9. golang 内置函数new()

    new() 这是一个用来分配内存的内置函数,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配的 t 类型的零值的指针. 在golang的代码定义如下: func new(t Type) ...

  10. Spoken English Practice(I'm gonna do something I never thought I'd be able to)

    绿色:连读:                  红色:略读:               蓝色:浊化:               橙色:弱读     下划线_为浊化 口语蜕变(2017/7/6) 英 ...