Leetcode每日一题:842.split-array-into-fibonacci-sequenc(将数组拆分成斐波那契序列)

Leetcode每日一题:842.split-array-into-fibonacci-sequenc(将数组拆分成斐波那契序列)_第1张图片
思路:深度优先搜索,设定最后返回的数组vec,每次搜索只处理一个数,这数可以取1位,也可以取很多位,这取决于前面两个放入vec的数的和(vec只有两个及以下的数时,直接放入),如果无法等于他俩的和,那么这个数没用,并且前一个数应该继续尝试新的数(这里就是回溯);如果遍历到最后我的vec中还有三个以上的数,则说明可行;
Leetcode每日一题:842.split-array-into-fibonacci-sequenc(将数组拆分成斐波那契序列)_第2张图片

//当前处理元素S[i]开始若干字符,如果能够与sum相等,继续处理下一部分元素,否则返回false,清除vec后面的元素
bool dfs(vector<int> &vec, string &S, int len, int cur, int sum, int pre)
{
     
    if (cur == len)
    {
     
        return vec.size() >= 3;
    }
    long long sum_cur = 0;
    for (int i = cur; i < len; i++)
    {
     
        //如果首位为0,但这个数字不知有1位,那么break;
        if (i > cur && S[i] == '0')
            break;
        sum_cur = sum_cur * 10 + S[i] - '0';
        if (sum_cur > INT32_MAX)
            break;
        //如果此时vec里面有两个以上的元素,那我就要开始比较
        if (vec.size() >= 2)
        {
     
            //如果sum_cur不等于sum
            if (sum_cur < sum)
                continue;
            if (sum_cur > sum)
                break;
        }
        //此时sum_cur==sum 或者vec元素个数小于2,放入当前数
        vec.push_back(sum_cur);
        if (dfs(vec, S, len, i + 1, pre + sum_cur, sum_cur))
            return true;
        //如果有被break的情况,说明前面加这个元素的这条路走不通,删除最后一个再尝试
        vec.pop_back();
    }
    return false;
}

vector<int> splitIntoFibonacci(string S)
{
     
    vector<int> vec;
    int len = S.size();
    dfs(vec, S, len, 0, 0, 0);
    return vec;
}

你可能感兴趣的:(Leetcode,leetcode,dfs,回溯)