题目来源
题目描述
题目解析
回溯
- 从左到右尝试,当前正在切割idx…作为第i个数。
- 回溯算法其实就是不断尝试的过程,一旦尝试成功了,就算成功了,如果尝试失败了还会回到上一步,注意回到上一步的时候还要把状态还原到上一步的状态。
- 什么叫做成功了:str已经被切割完成了,而且路径长度大于3
- 过程中需要剪枝
class Solution {
long long subDigit(string &str, int start, int end){
long res = 0;
for (int i = start; i <= end; ++i) {
res = res * 10 + str[i] - '0';
}
return res;
}
bool process(string &str, int idx, vector<int> &path){
int N = str.size();
if(idx == N && path.size() >= 3){
return true;
}
for (int i = idx; i < N; ++i) {
if(str[idx] == '0' && i > idx){
break;
}
long digit = subDigit(str, idx, i);
if(digit > INT32_MAX){
break;
}
int size = path.size();
if(size >= 2 && digit > path[size - 1] + path[size - 2]){
break;
}
if(size <= 1 || digit == path[size - 1] + path[size - 2]){
path.push_back(digit );
if(process(str, i + 1, path)){
return true;
}
path.pop_back();
}
}
return false;
}
public:
vector<int> splitIntoFibonacci(string str) {
vector<int>path;
process(str, 0, path);
return path;
}
};