class Solution {
public:
vector<int> splitIntoFibonacci(string S) {
vector<int> list;
backtrack(list, S, S.length(), 0, 0, 0);
return list;
}
bool backtrack(vector<int>& list, string S, int length, int index, long long sum, int prev) {
if (index == length) {
// 结束条件
return list.size() >= 3;
}
long long curr = 0;// 防止大数
for (int i = index; i < length; i++) {
if (i > index && S[index] == '0') {
// 剪枝:前导0
break;
}
curr = curr * 10 + S[i] - '0';
if (curr > INT_MAX) {
// 剪枝:大数
break;
}
if (list.size() >= 2) {
// 已划分的序列块超过2,可以开始判断是否符合斐波那契
if (curr < sum) {
continue;
}
else if (curr > sum) {
// 剪枝:列表中至少有 2 个数,并且拆分出的数已经大于最后 2 个数的和,则没有必要继续
break;
}
}
list.push_back(curr);
if (backtrack(list, S, length, i + 1, prev + curr, curr)) {
return true;
}
list.pop_back();
}
return false;
}
};