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
思路:刚一看这个题的时候没有思路,知道应该是用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.累加数的更多相关文章
- Java实现 LeetCode 306 累加数
306. 累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ...
- LeetCode:累加数【306】
LeetCode:累加数[306] 题目描述 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相 ...
- [Leetcode] 第306题 累加数
一.题目描述 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ' ...
- C#版 - Leetcode 306. 累加数 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- [LeetCode] 306. Additive Number [Medium]
306. Additive Number class Solution { private: string stringAddition(string &a, string &b) { ...
- Leetcode 306. Additive Number
Additive number is a string whose digits can form additive sequence. A valid additive sequence shoul ...
- C#LeetCode刷题-回溯算法
回溯算法篇 # 题名 刷题 通过率 难度 10 正则表达式匹配 18.8% 困难 17 电话号码的字母组合 43.8% 中等 22 括号生成 64.9% 中等 37 解数独 45.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 ...
- leetcode & lintcode 题解
刷题备忘录,for bug-free 招行面试题--求无序数组最长连续序列的长度,这里连续指的是值连续--间隔为1,并不是数值的位置连续 问题: 给出一个未排序的整数数组,找出最长的连续元素序列的长度 ...
随机推荐
- mysql学习之通过文件创建数据库以及添加数据
转自:http://blog.163.com/wujicaiguai@126/blog/static/170171558201411311547655/ 1.# 创建数据库语句 create data ...
- port 22: Connection refused
issue: os>ssh 196.168.27.90ssh: connect to host 196.168.27.90 port 22: Connection refused solutio ...
- AJPFX关于枚举,泛型详解
枚举类型是JDK5.0的新特征.Sun引进了一个全新的关键字enum来定义一个枚举类.下面就是一个典型枚举类型的定义:public enum Color{RED,BLUE,BLACK,YELLOW,G ...
- Phalcon初认识
Phalcon以c扩展交付的全堆栈php开发框架 基本功能 低开销:低内存消耗和CPU相比传统的框架 MVC和HMVC:模块.组件.模型.视图和控制器 依赖注入:依赖注入和位置的服务和它的本身他们的容 ...
- (转)让Spring自动扫描和管理Bean
http://blog.csdn.net/yerenyuan_pku/article/details/52861403 前面的例子我们都是使用XML的bean定义来配置组件.在一个稍大的项目中,通常会 ...
- mysql查询-从表1中查询出来的结果重新插入到表1
原有表结构 CREATE TABLE `t_card_user` ( `id` varchar(32) NOT NULL, `card_user_id` bigint(20) DEFAULT NULL ...
- oracle的系统表
-- DBA/ALL/USER/V_$/GV_$/SESSION/INDEX开头的绝大部分都是视图-- DBA_TABLES意为DBA拥有的或可以访问的所有的关系表.-- ALL_TABLES意为某一 ...
- ubuntu命令行转换图片像素大小
convert -resize 512x256 00433.png 00001.png 1.512和256之间是x(就是字母那个x),用' * '反而会报错 2.这个命令会按照原图的比例进行转换 3. ...
- zabbix auto registration
1./etc/zabbix/zabbix_agent.conf serverActive=zabbix server ip 2.frontend configuration>actions> ...
- InnoDB INFORMATION_SCHEMA Metrics Table
InnoDB INFORMATION_SCHEMA Metrics Table INNODB_METRICS表将所有InnoDB性能和资源相关计数器合并到一个INFORMATION_SCHEMA表中. ...