Description
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.
分析
题目的意思是:把一个字符串分割成Fibonacci数组序列。
- 回溯法。
Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
形如:0, 1, 1, 2, 3, 5, 8, 13, …,这种 - Fibonacci序列是当前的数为前两个数之和,弄清楚这个之后,我们就在递归遍历的时候进行判断就行了。终止条件就是idx遍历到末尾,并且res的size为3,表明已经有三个数了。否则返回false。递归的条件是前两个数只和等于当前的数。
代码
class Solution {
public:
vector<int> splitIntoFibonacci(string S) {
vector<int> res;
solve(S,0,res);
return res;
}
bool solve(string s,int idx,vector<int> &res){
if(idx==s.size()&&res.size()>=3){
return true;
}
long num=0;
for(int i=idx;i<s.size();i++){
if(i!=idx&&s[idx]=='0'){
return false;
}
num=num*10+s[i]-'0';
if(num>INT_MAX) return false;
if(res.size()>=2&&res[res.size()-2]+res.back()!=num) continue;
res.push_back(num);
if(solve(s,i+1,res)) return true;
res.pop_back();
}
return false;
}
};