博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode-306 Additive Number
阅读量:6636 次
发布时间:2019-06-25

本文共 1258 字,大约阅读时间需要 4 分钟。

题目

    给定一个字符串,字符串中的字符均为0-9的数字。判断字符串是否是一个合法的additive序列。additive 序列至少包含3个数字,除了最开始的两个数字,之后所有的数字都必须是它之前两个数字的和。比如字符串 "112358" 分割成 1,1,2,3,5,8 序列,序列从第三个数字开始,每个数字都是它前两个数字的和;字符串 "199100199"分割成序列1,99,100,199,从第三个数字开始,每个数字都是它前面两个数字的和。 

    题目链接:

    很容易想到递归去判断是否是additive 序列,但递归的几个参数如何确定?肯定要有前面两个数字a和 

b,然后还需要字符串去掉a和b之后的子串str,因此,可以有递归函数 isAdditive(ll a, ll b, string str). 
    然后,如何确定递归的入口呢?即a和b如何确定? 显然,使用0是不合理的,因此,只能枚举合法的a和b,然后再调用递归算法。

实现

typedef long long int ll;class Solution {public:	bool isAdditiveNumber(string num) {		int n = num.length();		for (int i = 1; i <= (n - 1) / 2; i++){			if (num[0] == '0' && i >= 2)				break;			for (int j = i + 1; j - i <= n - j && i <= n - j; j++){				if (num[i] == '0' && j - i >= 2)					break;				ll a = getNum(num, 0, i - 1);				ll b = getNum(num, i, j - 1);				if (helper(a, b, num.substr(j)))					return true;			}		}		return false;	}	ll getNum(string& str, int beg, int end){		ll result = 0;		while (beg <= end){			result *= 10;			result += str[beg] - '0';			beg ++;		}		return result;	}	bool helper(ll a, ll b, string str){		if (str.length() == 0)			return true;		ll c = a + b;		string cstr = to_string(c);		int k = 0;		while (k < cstr.length()){			if (cstr[k] != str[k])				return false;			k++;		}		return helper(b, c, str.substr(k));	}};

 

转载地址:http://qpsvo.baihongyu.com/

你可能感兴趣的文章
网络工程师应掌握的50个路由器知识要点
查看>>
su命令、sudo命令、限制root远程登录
查看>>
zabbix自动发现端口并监控
查看>>
【转】WaitForSingleObject()& ReleaseMutex()的用法
查看>>
加域时,客户机必须启动的服务
查看>>
MY BACKUP JOB COMPLETED BUT HAS EXCEPTIONS OR WARNINGS, WHY?
查看>>
杭电 hdu 2010
查看>>
Uwsgi的安装
查看>>
关于短信的管理:删除、读、等等
查看>>
仿猪八戒首页导航菜单
查看>>
Nginx 漏洞 (CVE-2018-16843,CVE-2018-16844)
查看>>
轻松解决“正在连接”无线的故障
查看>>
直接退出程序
查看>>
poj 2481 Cows【线段树单点更新】
查看>>
32位LINUX下hadoop2.2.0重新编译及安装步骤
查看>>
前端开发学习系列之一:准备工作
查看>>
活动目录中的Get-Aduser这个cmdlets调用的是账户的哪个属性?
查看>>
我的友情链接
查看>>
shell中if的参数说明
查看>>
随笔-java注解,反射,枚举
查看>>