leetcode日题 842. 将数组拆分成斐波那契序列

class Solution {
public:
    vector<int> splitIntoFibonacci(string S) {
        vector<int> list;
        backtrack(list, S, S.length(), 0, 0, 0);
        return list;
    }
    bool backtrack(vector<int>& list, string S, int length, int index, long long 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') {
                // 剪枝:前导0
                break;
            }
            curr = curr * 10 + S[i] - '0';
            if (curr > INT_MAX) {
                // 剪枝:大数
                break;
            }
            if (list.size() >= 2) {
                // 已划分的序列块超过2,可以开始判断是否符合斐波那契
                if (curr < sum) {
                    continue;
                }
                else if (curr > sum) {
                    // 剪枝:列表中至少有 2 个数,并且拆分出的数已经大于最后 2 个数的和,则没有必要继续
                    break;
                }
            }
            list.push_back(curr);
            if (backtrack(list, S, length, i + 1, prev + curr, curr)) {
                return true;
            }
            list.pop_back();
        }
        return false;
    }
};
posted @ 2020-12-08 16:21  悲惨痛苦太刀  阅读(65)  评论(0编辑  收藏  举报