zoukankan      html  css  js  c++  java
  • 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. 1 <= S.length <= 200
    2. S contains only digits.

    Approach #1: C++.

    class Solution {
    public:
        vector<int> splitIntoFibonacci(string S) {
            vector<int> nums;
            helper(S, nums, 0);
            return nums;
        }
        
        bool helper(string S, vector<int>& nums, int start) {
            int len = S.length();
            // if we reached end of string & we have more than 2 elements
            // in our sequence then return true
            if (start >= len && nums.size() >= 3) return true;
            // since '0' in beginning is not allowed therefore if the current char is '0'
            // then we can use it alone only and cann't extend it by adding more chars at the back.
            // otherwise we make take upto 10 chars (length og MAX_INT)
            int maxLen = (S[start] == '0') ? 1 : 10;
            
            // Try getting a solution by forming a number with 'i' chars begging with 'start'
            for (int i = 1; i <= maxLen && start + i <= S.size(); ++i) {
                long long temp = stoll(S.substr(start, i));
                if (temp > INT_MAX) return false;
                int sz = nums.size();
                // If fibonacci property is not satisfied then we cann't get a solution
                if (sz >= 2 && nums[sz-1] + nums[sz-2] < temp) return false;
                if (sz <= 1 || nums[sz-1] + nums[sz-2] == temp) {
                    nums.push_back(temp);
                    if (helper(S, nums, start+i))
                        return true;
                    nums.pop_back();
                }
            }
            return false;
        }
    };
    

      

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    Jquery实现Gridview全选功能
    SQL Server日期计算
    避免表格table被撑开变形的CSS代码实例
    oracle游标使用
    最短路径算法及应用
    Jquery实现GridView隔行变色,鼠标经过变色,单击或者选中变色
    【项目】项目109
    【项目】项目107
    【项目】项目111
    【项目】项目110
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10305438.html
Copyright © 2011-2022 走看看