842. 将数组拆分成斐波那契序列
思路
- 回溯法,通过遍历字符串的前缀,划分数组,直到字符串划分完毕。
- 剪枝,如果划分的字符串是以0开头的,不用继续划分了。
- 划分的字符串大于INT_MAX了,不用继续划分了。
- 划分的字符串大于前面两个值的和时,不用继续划分了。
代码
class Solution {
public:
vector<int> splitIntoFibonacci(string S) {
vector<int> list;
dfs(list, S, S.size(), 0, 0, 0);
return list;
}
bool dfs(vector<int>& list, string S, int len, int index, long long sum, int prev) {
if(index == len) {
return list.size() >= 3;
}
long long cur = 0;
for(int i = index; i < len; i++) {
if(i > index && S[index] == '0') {
break;
}
cur = cur * 10 + S[i] - '0';
if(cur > INT_MAX) {
break;
}
if(list.size() >= 2) {
if(cur < sum) {
continue;
}
else if(cur > sum) {
break;
}
}
list.push_back(cur);
if(dfs(list, S, len, i + 1, prev + cur, cur)) {
return true;
}
list.pop_back();
}
return false;
}
};