[leetcode] 842. Split Array into Fibonacci Sequence

441 篇文章 0 订阅
284 篇文章 0 订阅

Description

Given a string S of digits, such as S = “123456579”, we can split it into a Fibonacci-like sequence [123, 456, 579].

Formally, a Fibonacci-like sequence is a list F of non-negative integers such that:

0 <= F[i] <= 2^31 - 1, (that is, each integer fits a 32-bit signed integer type);
F.length >= 3;
and F[i] + F[i+1] = F[i+2] for all 0 <= i < F.length - 2.
Also, note that when splitting the string into pieces, each piece must not have extra leading zeroes, except if the piece is the number 0 itself.

Return any Fibonacci-like sequence split from S, or return [] if it cannot be done.

Example 1:

Input:

"123456579"

Output:

[123,456,579]

Example 2:

Input:

"11235813"

Output:

[1,1,2,3,5,8,13]

Example 3:

Input:

"112358130"

Output:

[]

Explanation:

The task is impossible.

Example 4:

Input:

"0123"

Output:

[]

Explanation:

Leading zeroes are not allowed, so "01", "2", "3" is not valid.

Example 5:

Input:

"1101111"

Output:

[110, 1, 111]

Explanation:

The output [11, 0, 11, 11] would also be accepted.

Note:

  1. 1 <= S.length <= 200
  2. S contains only digits.

分析

题目的意思是:把一个字符串分割成Fibonacci数组序列。

  • 回溯法。
    Fibonacci数列是这样定义的:
    F[0] = 0
    F[1] = 1
    for each i ≥ 2: F[i] = F[i-1] + F[i-2]
    形如:0, 1, 1, 2, 3, 5, 8, 13, …,这种
  • Fibonacci序列是当前的数为前两个数之和,弄清楚这个之后,我们就在递归遍历的时候进行判断就行了。终止条件就是idx遍历到末尾,并且res的size为3,表明已经有三个数了。否则返回false。递归的条件是前两个数只和等于当前的数。

代码

class Solution {
public:
    vector<int> splitIntoFibonacci(string S) {
        vector<int> res;
        solve(S,0,res);
        return res;
    }
    
    bool solve(string s,int idx,vector<int> &res){
        if(idx==s.size()&&res.size()>=3){
            return true;
        }
        long num=0;
        for(int i=idx;i<s.size();i++){
            if(i!=idx&&s[idx]=='0'){
                return false;
            }
            num=num*10+s[i]-'0';
            if(num>INT_MAX) return false;
            if(res.size()>=2&&res[res.size()-2]+res.back()!=num) continue;
            res.push_back(num);
            if(solve(s,i+1,res)) return true;
            res.pop_back();
        }
        return false;
    }
};

参考文献

842. Split Array into Fibonacci Sequence
Fibonacci数列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值