classSolution{ List<Integer> result = new ArrayList<>();
public List<Integer> splitIntoFibonacci(String S){ backtrack(S, 0); return result; }
booleanbacktrack(String s, int index){ //index已经到字符串结尾并且result大小大于3,表示已经找到了一个满足要求的组合 if (index == s.length() && result.size() >= 3) { returntrue; }
// for (int i = index; i < s.length(); i++) { //这里说明两位以上的数组不能以0开头 if (s.charAt(index) == '0' && i > index) { break; }
long num = subDigit(s, index, i + 1);
//即判断该数值是否大于斐波那契序列要求,如果大于直接后面的都会比当前大,直接终止 if (num > Integer.MAX_VALUE) { break; }
int size = result.size(); if (size >= 2 && num > result.get(size - 1) + result.get(size - 2)) { break; } if (size <= 1 || num == result.get(size - 1) + result.get(size - 2)) { result.add((int) num); if (backtrack(s, i + 1)) { returntrue; } //如果不满足条件,就需要回溯,把前面添加的最后一位不满足要求的数字从result中剔除 result.remove(result.size() - 1); } } returnfalse; }
//该方法用于将字符串转换为长整形数值 longsubDigit(String s, int start, int end){ long res = 0; for (int i = start; i < end; i++) { res = res * 10 + s.charAt(i) - '0'; } return res; } }