842. Split Array into Fibonacci Sequence

主要难度在于涉及到大型int相加,可能超范围,因此需要进行判断后,才能确定能不能加起来。

class Solution {
public:
    // 对于0处的切分点有要求,01,是不允许的。
    // 将S切成fibonacci,至少为三段,满足 F[i] + F[i+1] = F[i+2],数值为正数。
    // 不可能,则返回空。
    
    // max value 2,147,483,647
    bool judge(string s){
        if (s.size()<10){
            return true;
        }
        else if (s.size()>10){
            return false;
        }
        else{ //=10
            if (s>"2147483647"){
                return false;
            }
            else{
                return true;
            }
        }
    }
    
    string addable(string s1, string s2){
        if (judge(s1)&&judge(s2)){
            int a1 = atoi(s1.c_str());
            int a2 = atoi(s2.c_str());
            if (a1>2147483647-a2){
                return "";
            }
            else{
                return to_string(a1+a2);
            }
        }
        else{
            return "";
        }
        
    }
    
    vector<int> splitIntoFibonacci(string S) {
        
        for(int lena=1;lena<S.size();lena++){
            if (S[0]=='0'&&lena>=2){break;}
            for(int lenb=1;lenb<S.size();lenb++){
                int maxlen = lena>lenb?lena:lenb;
                if(lena+lenb+maxlen>S.size()){break;}
                if(S[lena]=='0'&&lenb>=2){break;}
                string a = S.substr(0, lena);
                string b = S.substr(lena, lenb);
                vector<string> res;
                res.push_back(a);
                res.push_back(b);
                string res2 = "" + a + b;
                while(res2.size()<S.size()){
                    string next = addable(a, b);
                    if (next.size()==0){
                        break;
                    }
                    a = b;
                    b = next;
                    res.push_back(next);
                    res2 = res2 + next;
                    if(S.substr(0, res2.size())!=res2){break;}
                }
                if(res2==S){
                    vector<int> ress;
                    for(int i=0;i<res.size();i++){
                        ress.push_back(atoi(res[i].c_str()));
                    }
                    return ress;
                }
                else{
                    continue;
                }
            }
        }
        
        vector<int> res;
        return res;
        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值