给定一个数字字符串 num,比如 “123456579”,我们可以将它分成「斐波那契式」的序列 [123, 456, 579]。
形式上,斐波那契式 序列是一个非负整数列表 f,且满足:
- 0 <= f[i] < 231 ,(也就是说,每个整数都符合 32 位 有符号整数类型)
- f.length >= 3
- 对于所有的0 <= i < f.length - 2,都有 f[i] + f[i + 1] = f[i + 2]
- 另外,请注意,将字符串拆分成小块时,每个块的数字一定不要以零开头,除非这个块是数字 0 本身。
返回从 num 拆分出来的任意一组斐波那契式的序列块,如果不能拆分则返回 []。
示例 1:
输入:num = "1101111"
输出:[11,0,11,11]
解释:输出[110,1,111]也可以。
示例 2:
输入:"0123"
输出:[]
解释:每个块的数字不能以零开头,因此 "01","2","3" 不是有效答案。
class Solution {
List<Integer>res=new ArrayList<>();
List<Integer>ans=new ArrayList<>();
public List<Integer> splitIntoFibonacci(String num) {
if(num.length()<3) return res;
int[]nums=new int[num.length()];
for(int i=0;i<num.length();i++) nums[i]=num.charAt(i)-'0';
dfs(nums,0);
return ans;
}
public void dfs(int[]nums,int depth){
if(depth==nums.length && res.size()>=3) {
ans=new ArrayList<>(res);
return;
}
for(int i=depth;i<nums.length;i++){
if(nums[depth]==0 && i>depth) return;//多位数不能以0开头
long cur=0;
for(int j=depth;j<=i;j++) cur=cur*10+nums[j];
if(cur>Integer.MAX_VALUE) return;
//第三个数太大了
if(res.size()>=2&&cur>res.get(res.size()-1)+res.get(res.size()-2)) return;
//合法
if(res.size()<=1||cur==res.get(res.size()-1)+res.get(res.size()-2)){
res.add((int)cur);
dfs(nums,i+1);
res.remove(res.size()-1);
}
}
}
}