最近这几天的每日一题都不简单啊。。。这道题实在没想到真的是这么暴力的回溯,我还以为又是和前几天的每日一题有什么骚操作可以一次遍历搞定。。
这里回溯的想法是尝试所有如下:
1,2,3…; 1,23,4…; 1,234,5…; …
12,3,4…; 12,34,5…; 12,345,6…; …
其实就是去遍历分别以1,12,123,1234等为开头的情况,去找到分割数大于等于3且满足前两个的和为第三的条件!
并且可以进行剪枝(来自官方题解):
代码
class Solution {
public:
vector<int> splitIntoFibonacci(string S) {
vector<int> res;
DFS(S,res,0,0,0);
return res;
}
bool DFS(string S, vector<int>& res, int index, int prev, int sum){
if(index == S.size())
return (res.size()>=3);
long current = 0;
for(int i = index;i<S.size();i++){
if(i>index && S[index] == '0')
break;
current = current*10 + (S[i] - '0');
if (current > INT_MAX) {
break;
}
if(res.size()>=2){
if(sum>current)
continue;
else if(sum<current)
break;
}
res.push_back(current); // 可以push_back的情况:res的数量小于3 || sum==current
if(DFS(S,res,i+1,current,current+prev))
return true;
else{
res.pop_back();
}
}
return false;
}
};