package Leetcode; import java.util.ArrayList; import java.util.List; /** * 给定一个数字字符串 S,比如 S = "123456579",我们可以将它分成斐波那契式的序列 [123, 456, 579]。 形式上,斐波那契式序列是一个非负整数列表 F,且满足: 0 <= F[i] <= 2^31 - 1,(也就是说,每个整数都符合 32 位有符号整数类型); F.length >= 3; 对于所有的0 <= i < F.length - 2,都有 F[i] + F[i+1] = F[i+2] 成立。 另外,请注意,将字符串拆分成小块时,每个块的数字一定不要以零开头,除非这个块是数字 0 本身。 返回从 S 拆分出来的任意一组斐波那契式的序列块,如果不能拆分则返回 []。 */ public class splitToFibonaci { public static void main(String[] args) { String s="5511816597"; List<Integer> list=splitIntoFibonacci(s); int x=0; } public static List<Integer> splitIntoFibonacci(String S){ List<Integer> res=new ArrayList<>(); helper(S.toCharArray(), res, 0); return res; } public static boolean helper(char []s,List<Integer> res,int index){ //终止条件,到末尾而且得到至少一组三个斐波那契数 if(index==s.length&&res.size()>=3){ return true; } for(int i=index;i<s.length;i++){ // if(s[index]=='0'&&i<index){ // break; // } //0开头,至少两位 if(s[index]=='0'&&i>index){ break; } //index开头到i的数转化成int long num=getNum(index, i+1, s); if(num>Integer.MAX_VALUE){ break; } //第三个数比前面两个和都大,不用截取更长的了,break if(res.size()>=2&&res.get(res.size()-1)+res.get(res.size()-2)<num){ break; } //只有一个或者组成一组斐波那契序列 if(res.size()<=1||res.get(res.size()-1)+res.get(res.size()-2)==num){ res.add((int)num); //到第三个数后面一个字母重新开始这个过程,到最后成功了返回 if(helper(s, res, i+1)){ return true; } //不成功不断弹出最近添加的数,回溯 res.remove(res.size()-1); } } return false; } public static long getNum(int begin,int end,char []c){ long x=0; for(int i=begin;i<end;i++){ x=x*10+c[i]-'0'; } return x; } public static List<Integer> splitIntoFibonacci1(String S) { int flag=0; List<Integer> list=new ArrayList<>(); for (int j=1;j<=S.length()/3;j++){ for(int i=0;i+3*j<=S.length();i++){ int x1=Integer.parseInt(S.substring(i,i+j)); int x2=Integer.parseInt(S.substring(i+j,i+2*j)); int x3=Integer.parseInt(S.substring(i+2*j,i+3*j)); if(!list.contains(x1)){ list.add(x1); } if(!list.contains(x2)){ list.add(x2); } if(!list.contains(x3)){ list.add(x3); } if(x1+x2!=x3){ flag=1; list.clear(); break; } } if(flag==0){ return list; }else{ flag=0; } } return new ArrayList<>(); } }