题目描述
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();
}
}
};