问题
将字符串分割出形如斐波那契数列的字符串数组。给定一个数字串S,例如S =“123456579”,我们可以将它分割成一个类似于斐波那契的序列[123,456,579]。
满足三个条件:1,长度必须大于3;2、每一个元素的值必须是整数范围内;3、满足斐波那契数列的性质
解析
这是典型的回溯法解决的问题。首先从1出发,然后假设第2个数字是2,那么继续往下判断;当无法构成斐波那契数列时,就回溯到原来位置,变成23…。然后接着改变第一个位置1,以此类推,直到最后所有的字符切分后能构成一个满足要求的数组。
Java代码
List<Integer> list =new ArrayList();
public List<Integer> splitIntoFibonacci(String S) {
dfs(S,0);
return list;
}
public boolean dfs(String S, int pos){
if(pos==S.length()){
if(list.size()<3){
return false;
}
return true;
}
int num=0;
for(int i=pos;i<S.length();i++){
num = num *10+S.charAt(i)-'0';
//这里必须加一句,防止整数溢出,
if(num<0) return false;
if(list.size()<2||list.get(list.size()-1)+list.get(list.size()-2)==num){
//满足要求,添加至数组中
list.add(num);
//看下一个数字是否满足要求,不满足那么就删掉
if(dfs(S,i+1)){
return true;
}
list.remove(list.size()-1);
}
//如果当前位置是0,那么就没必要比较了,因为前面的数字大于0
if(i==pos&&S.charAt(i)=='0')
return false;
}
return false;
}