1427. Split Array into Fibonacci Sequence

Description

中文English
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.
  • 1 <= S.length <= 200
  • S contains only digits.

Example

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.
Code(Language:C++)
class Solution {
public:
    /**
     * @param S: a string S of digits
     * @return: Return any Fibonacci-like sequence split from S
     */
    vector<int> splitIntoFibonacci(string &S) {
        // write your code here 
        vector<int> res; 
        vector<int> res1; 
        dfs(S, res, res1, 0); 
        return res1; 
    }
    void dfs(string &S, vector<int> &res, vector<int>&res1, int start){
        
        int size = res.size(); 
        if(size >= 3){
            if(res[size - 1] != res[size - 2] + res[size - 3]){
                return; 
            }
        }
        if(start == S.size()){
            int strSize = 0;
            for(int i = 0; i < size; i++){
                strSize += to_string(res[i]).size(); 
            }
            if(S.size() == strSize && res.size() >= 3){
              res1 = res; 
            }
            return; 
        }
        
        for(int i = start; i < S.size(); i++){
                if(S[i] == '0' && i > start){
                    return; 
                }
                int cur = stoi(S.substr(start, i - start + 1)); 
                res.push_back(cur);
                dfs(S, res, res1, i + 1); 
                res.pop_back();
            
        }
        return;
    }
};

Comments

Popular posts from this blog

Amazon OA 763. Partition Labels

05/25 周一