LeetCode 842 题解

https://leetcode.com/problems/split-array-into-fibonacci-sequence/description/

题目大意:给你一个串S,问能否将其变成满足fibonacci数列规则的一个数列,即f[i]+f[i+1] =f[i+2],其中所有的数都在整形范围内。

解题思路:暴力分解,加上一点处理的小技巧。先暴力找前两位a和b,然后剩下的字符里判断 a+b的值 c

1.c是否在整形范围

2.c是否满足是剩下字符的开头

之后 a=b, b=c继续递归

class Solution {
    private List<Integer> find(int a,int b,String s)
    {
        List<Integer> res =new ArrayList<>();
        res.add(a);
        res.add(b);
        long c = a+b;
        if( c>Integer.MAX_VALUE ) return new ArrayList<>();
        int cnt = Integer.toString((int)c).length();
        while(s.length()>0)
        {
            c = a+b;
            if( c<0 ) return new ArrayList<>();
            cnt = Integer.toString((int)c).length();

            if( s.startsWith(Integer.toString((int)c)))
            {
                res.add((int)c);
                s=s.substring(cnt);
            }
            else
            {
                return new ArrayList<>();
            }
            a=b;
            b=(int)c;
        }
        return res;
    }
    public List<Integer> splitIntoFibonacci(String S) {
        int n = S.length();
        for(int i=1;i<n;i++)
        {
            String sa = S.substring(0,i);
            Long a = Long.valueOf(sa);
            if(a>Integer.MAX_VALUE) break;
            for(int j=1;j+i+1<n;j++)
            {
                String sb = S.substring(i,i+j);
                Long b = Long.valueOf(sb);
                if(b>Integer.MAX_VALUE) break;
                if( (a==0 && sa.length()>1) || (b==0 && sb.length()>1) ) continue;
                List<Integer> res = find(a.intValue(),b.intValue(),S.substring(i+j));
                if(res!=null && res.size()>=3)
                    return res;
            }
        }
        return new ArrayList<>();
    }
}

猜你喜欢

转载自blog.csdn.net/u011439455/article/details/80483453