【LeetCode 842】 Split Array into Fibonacci Sequence

题目描述

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 <= S.length <= 200
S contains only digits.

思路

DFS,每个数字搜索。注意INT边界判断。

代码

class Solution {
public:
    vector<int> splitIntoFibonacci(string S) {
        vector<long long> res;
        dfs(S, 0, res, 0);
        cout << INT_MAX << endl;
        return ans;
    }
    
private:
    vector<int> ans;
    bool flag = false;
    
    void dfs(string S, int cnt, vector<long long>& res, int index) {
        if (flag) return;
        if (index == S.length()) {
            if (res.size() >= 3 && ans.empty()) {
                ans = vector<int> {res.begin(), res.end()};
                flag = true;
            }
            return;
        }
        if (index > S.length()) return;
        if (cnt == 0 || cnt == 1) {
            long long tmp = 0;
            for (int l=1; l<=S.length()-index; ++l) {
                if (l > 10) break;
                string cur = S.substr(index, l);
                if (cur[0] == '0' && l > 1) continue;
                tmp = stol(cur);
                if (tmp >= INT_MAX) continue;
                res.push_back(tmp);
                dfs(S, cnt+1, res, index+l);
                res.pop_back();
            }
        }else {
            long long pre = res[cnt-1] + res[cnt-2];
            if (pre > INT_MAX) return;
            string tmp = to_string(pre);
            if (tmp[0] == '0' && tmp.length() > 1) return;
            if (S.substr(index, tmp.length()) != tmp) return;
            res.push_back(pre);
            dfs(S, cnt+1, res, index+tmp.length());
            res.pop_back();
        }
    }
};
发布了323 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/iCode_girl/article/details/104961093