题目链接:https://leetcode-cn.com/problems/split-array-into-fibonacci-sequence/
题意:给你一个数字字符串,问能否把这个数字字符串分成一个斐波那契数列,斐波那契数列的要求是:序列长度大于3、每个数都在int范围内、满足f(n-2)+f(n-1)=f(n)。满足的话输出对应序列块,不满足的话则输出[]。
分析:用回溯来进行拆分,比如说把当前字符串的第一个字符当做一个数,继续往下拆分,如果不可以的话,就将当前的前两个字符当做一个数,继续往下拆分,还不可以的话,就当前的前3个字符...就这样依次拆分下去,然后加了3个优化,一个是当前字符串如果以0开头的话,只能让这个0单独做一个数,不能和其他字符继续组数;第二个是判断当前数是否在int范围内;第三个是当前数如果已经大于前两个数之和,就没有必要继续判断和拆分了。代码如下:
class Solution { public: vector<int> list; int length; vector<int> splitIntoFibonacci(string S) { length=S.length(); backTrack(S,0,0,0); return list; } bool backTrack(string s,int index,int 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')break;//优化1,以0开头不可行 curr=curr*10+s[i]-'0'; if (curr > INT_MAX) { break; } if (list.size() >= 2) { if (curr < sum) { continue; } else if (curr > sum) { break; } } list.push_back(curr); if(backTrack(s,i+1,prev+curr,curr))return true; list.pop_back(); } return false; } };