欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode 累加数(回溯法)

程序员文章站 2022-07-15 11:34:08
...

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

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

进阶:
你如何处理一个溢出的过大的整数输入?

思路分析:使用回溯法。
首先确定起始两个字符串strOne, strTwo,以及之后的curStr,然后根据这两个字符串计算出第三个字符串strThree,然后判断这个两个字符串后的字符串curStr是不是以strThree打头。如果是更新strTwo为下一次计算的第一个字符串,strThree为下一次计算的第二个字符串,重复上述操作。

class Solution {
public:
    //判断strOne + strTwo的结果是否在curStr的起始位置
	bool myAdd(string &strOne, string &strTwo, string &curStr) {
		if (curStr == "") {
			return false;
		}
		string strThree = to_string(atoll(strOne.c_str()) + atoll(strTwo.c_str()));//将第一个串、第二个串转换为长整型,相加,再转换成字符串三
		string curStartStr = curStr.substr(0, strThree.size());//寻找curStr中的起始字符串
		if (strThree == curStartStr) {//判断是否相等
			string nowCurStr = curStr.substr(strThree.size(), curStr.size());
			if (nowCurStr.size() > 0) {//如果curStr去除strThree还未到达尾端
				return myAdd(strTwo, strThree, nowCurStr);//更新前两个字符串,继续计算寻找
			}
			else {
				return true;//到达了尾端,就直接返回true
			}
		}
		else {
			return false;
		}

	}
	bool isAdditiveNumber(string num) {
		int numSize = num.size();
        //第一层for确定第一个字符串的尾端
		for (int firstEnd = 1; firstEnd < numSize - 1; ++firstEnd) {
            if (num[0] == '0' && firstEnd > 1) {//剪枝  字符串1不能出现“023”这种
					break;
			}
            //第二层for寻转确定第二个字符串的尾端
			for (int secondEnd = firstEnd + 1; secondEnd < numSize; ++secondEnd) {
                if (num[firstEnd] == '0' && secondEnd - firstEnd > 1) {//剪枝  字符串2不能出现“023”这种
					break;
				}
				string strOne = num.substr(0, firstEnd);//第一个字符串
				string strTwo = num.substr(firstEnd, secondEnd - firstEnd);//第二个字符串
				string curStr = num.substr(secondEnd, numSize);//num去除第一、第二个字符串剩余的字符串
				if (myAdd(strOne, strTwo, curStr)) {//如果成功,则退出
					return true;
				}
			}
		}
		return false;
	}
};

LeetCode 累加数(回溯法)