20.12.8 leetcode842

题目链接: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;
    }
};
原文地址:https://www.cnblogs.com/qingjiuling/p/14103046.html