LeetCode 842 Split Array into Fibonacci Sequence

问题

将字符串分割出形如斐波那契数列的字符串数组。给定一个数字串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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值