累加数

累加数是一个字符串,组成它的数字可以形成累加序列。

一个有效的累加序列必须至少包含 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

思路:刚一看这个题的时候没有思路,知道应该是用dfs或backtracking一类的算法,但是不知道如何下手,只好看答案,看了答案之后恍然大悟,其实很简单。

解题的关键在于确定前两个数,只要确定了前两个数,后面的数可以依次计算出来,要么符号条件要么不符合条件。那么如何确定前两个数?

首先分析如何确定第一个数,第一个数的最小的长度是1(只包含一个数字),最大的长度是(L-1)/2,其中L为字符串的长度,最大的长度一定小于总长度的一半,比如如果总长度是5,第一个数长度不能超过2,如果总长度是6,第一个数长度也不能超过2,所以最大的长度是(L-1)/2,。

再确定第二个数的范围,第二个数从第一个数后面开始,第三个数从第二个数后面开始,我们首先知道,第三个数肯定至少和第一个数与第二个数一样大,因为是和嘛,若第二个数从i开始到j-1结束,那么第三个数长度最大为L-j,这个长度一定大于等于第一个数和第二个数长度的较大者,即:L-j>=i && L-j>=j-i。

确定了第二个数的范围之后问题就简单了,看看能不能构成加法序列,只要判断剩下的字串是不是以sum开头即可,然后递归判定,代码如下:

//这题的关键在于找前两个数,前两个数确定了,后面的依次判断即可

//第一个数肯定从0开始,但最长是(L-1)/2,第二个数从第一个数后面开始,第三个数至少跟第一个和第二个较大的数一样长

 class Solution {
public boolean isAdditiveNumber(String num) {
int L = num.length();
//确定第一个数,最终用num.subStr(0,i)来确定第一个数,所以i可以用来标示第一个数的长度,
// 但是下标i不包含在第一个数中
for (int i = 1; i <= (L - 1) / 2; i++) {
//如果长度大于等于2,则不能以0开头
if (num.startsWith("0") && i >= 2) break;
//确定第二个数,第一个数用num.subStr(i,j),包括i,不包括j,所以长度为j-i,
// 第三个数从下标j开始,长度最长为L-1-j+1,即L-j
for (int j = i + 1; (L - j) >= i && (L - j) >= j - i; j++) {
if (num.charAt(i) == '0' && j - i >= 2) break;
long num1 = Long.parseLong(num.substring(0, i));
long num2 = Long.parseLong(num.substring(i, j));
if (isAdditive(num.substring(j), num1, num2)) {
return true;
}
}
}
return false;
}
//判断由num1,num2和后续的字串能否构成加法序列
public boolean isAdditive(String remain, long num1, long num2) {
if (remain.equals("")) return true;
long sum = num1 + num2;
String sumStr = "" + sum;
if (!remain.startsWith(sumStr)) return false;
return isAdditive(remain.substring(sumStr.length()), num2, sum);
}
}

Leetcode 306.累加数的更多相关文章

  1. Java实现 LeetCode 306 累加数

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

  2. LeetCode:累加数【306】

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

  3. [Leetcode] 第306题 累加数

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

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

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

  5. [LeetCode] 306. Additive Number [Medium]

    306. Additive Number class Solution { private: string stringAddition(string &a, string &b) { ...

  6. Leetcode 306. Additive Number

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

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

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

  8. leetcode & lintcode for bug-free

    刷题备忘录,for bug-free leetcode 396. Rotate Function 题意: Given an array of integers A and let n to be it ...

  9. leetcode & lintcode 题解

    刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...

随机推荐

  1. 刷ID卡的就餐系统

    需求分析:公司旧的考勤系统,缺 “就餐”功能模块,不能查询和统计每天的就餐人数.故需开发一个简易的“刷ID卡的就餐系统”,三 部 分组成,一部分为人事资料的增删改查,二部分为处理从“刷卡就餐机”采集的 ...

  2. 浅析cookie

    基本概念:cookie是指web浏览器存储的少量数据,该数据会在每次请求一个相关的URL时自动传到服务器中. 以博客园为例,我们看看cookie有哪些属性:  1.Name:cookie的名称: 2. ...

  3. sql 防注入插入

    var strsql = "insert into Staff_Answer (ExamTitleID,QuestionsID,MultipleChoice,RightOption,Answ ...

  4. 一份最贴近真实面试的Java基础面试题

    这是一份Java基础知识的面试题.在网上的关于Java的面试题数不胜数,但认真看过感觉大多数都没有实用性,有很多是面试官根本就不会问到的,那些已经脱离了实际开发的技术问题.而这份资料来源自一份个人觉得 ...

  5. HTTPS时代已来,你做好准备了吗?

    早在今年年初,Google在其安全博客上已经表明,从7月开始,Chrome68会将所有的HTTP网站标记为不安全.随后,Mozilla也表明,Firefox浏览器也准备将所有HTTP网站标记为不安全. ...

  6. 分布式技术EJB3_分库架构 - 【动力节点官网】北京Java …

    分布式技术EJB3_分库架构 - [动力节点官网]北京Java … http://www.bjpowernode.com/xiazai/2220.html <程序天下--EJB JPA数据库持久 ...

  7. monkeyrunner 简单用例编写

    monkeyrunnerfrom com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImagedevice = Monke ...

  8. vue路由高级语法糖

    1.当 <router-link> 对应的路由匹配成功,将自动设置 class 属性值 .router-link-active. 模板中可以用{{$route.params.xxx取到路由 ...

  9. SQLite -语法

    SQLite -语法 SQLite是紧随其后的是独特的组称为语法的规则和指导方针.本教程为您提供了快速启动和SQLite的清单的所有基本SQLite语法. 大小写敏感性 注意重要的一点是,SQLite ...

  10. 关于sigleton模式

    单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例. 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中 ...