1. 题目
累加数是一个字符串,组成它的数字可以形成累加序列。
一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。
给定一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是累加数。
说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。( 101, 000,是true)
示例 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进阶:
你如何处理一个溢出的过大的整数输入?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/additive-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
依次枚举所有的可能的前两个数的组合,按照该组合向后验证
class Solution {string sum, p, q;
public:bool isAdditiveNumber(string num) {int i, j;if(num.size()<3)return false;for(i = 0; i < num.size()/2; i++) {for(j = i+1; j < num.size()-1; j++){sum = p = q = "";if(isAdd(num,i,j))return true;}}return false;}bool isAdd(string& num, int i, int j) {p = num.substr(0,i+1);//第一个数if(p.size() != 1 && p[0] == '0')//以0开头return false;while(j < num.size()){sum = "";q = num.substr(i+1,j-i);//第二个数if(q.size() != 1 && q[0] == '0')//以0开头return false;add(p, q);//大数加法,得到sum字符串if(j+sum.size() >= num.size() || sum != num.substr(j+1,sum.size()))return false;p = q;i = j;j += sum.size();if(j == num.size()-1)break;}return true;}void add(string& a, string& b){int i = a.size()-1, j = b.size()-1, carry = 0, bit, s;while(i >= 0 || j >= 0 || carry){s = carry+ (i>=0 ? a[i--]-'0' : 0) + (j>=0 ? b[j--]-'0' : 0);bit = s%10;carry = s/10;sum.insert(0,1,bit+'0');}}
};