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;
}
};
上一篇: wsgi python_Python Web应用程序:WSGI的基础
下一篇: 306.累加数