leetcode-842. 将数组拆分成斐波那契序列之回溯法DFS

在这里插入图片描述
最近这几天的每日一题都不简单啊。。。这道题实在没想到真的是这么暴力的回溯,我还以为又是和前几天的每日一题有什么骚操作可以一次遍历搞定。。
这里回溯的想法是尝试所有如下:
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;

        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值