主要难度在于涉及到大型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;
}
};