回溯法——20200204

7 Leetcode306.累加数
7.1题目描述
累加数是一个字符串,组成它的数字可以形成累加序列。

一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。

给定一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是累加数。

说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。

示例 1:
输入: “112358”
输出: true
解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8

示例 2:
输入: “199100199”
输出: true
解释: 累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199

进阶:
你如何处理一个溢出的过大的整数输入?

7.2分析
回溯法,注意大整数
7.3代码
#define MAX 200

//判断str1 + str2 == result ?
bool equal(char str1[MAX], char str2[MAX], char result[MAX]) {
int length1 = strlen(str1);
int length2 = strlen(str2);
int max = length1 > length2 ? length1 : length2;
int length = strlen(result);
if(!(length == max || length == max + 1)) {
return false;
}

long long int num1 = atol(str1);
long long int num2 = atol(str2);
long long int resultNum = atol(result);
return num1 + num2 == resultNum;

}

bool isAdd(char * num, int index, char nums[MAX][MAX], int numsSize) {
int length = strlen(num);
int i = 0, j = 0, k = 0;
int x = 0, y = 0;
int tmpNum = 0, tmp = 0;
if(index >= length) {
if(numsSize <= 2) {
return false;
}
for(i = 1; i < numsSize - 1; i++) {
if(!equal(nums[i], nums[i - 1], nums[i + 1])) {
return false;
}
}
return true;
}

char tmpNums[MAX][MAX];
int tmpNumsSize = 0;

//剪枝
if(numsSize > 2) {
    for(i = 1; i < numsSize - 1; i++) {
        if(!equal(nums[i], nums[i - 1], nums[i + 1])) {
            return false;
        }
    }
}

//遍历
for(j = index; j < length; j++) {
    //说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
    if(num[index] == '0' && j > index) {
        return false;
    }

    //先把tmpNums初始化
    for(x = 0; x < MAX; x++) {
        for(y = 0; y < MAX; y++) {
            tmpNums[x][y] = '\0';
        }
    }

    //复制传进来的到tmpNums
    if(nums != NULL) {
        for(x = 0; x < numsSize; x++) {
            for(y = 0; y < strlen(nums[x]); y++) {
                tmpNums[x][y] = nums[x][y];
            }
        }
    }

    tmpNumsSize = numsSize;

    //添加新的数字
    tmp = 0;
    for(k = index; k <= j; k++) {
        tmpNums[tmpNumsSize][tmp] = num[k];
        tmp++;
    }
    tmpNumsSize++;

    //剪枝
    if(tmpNumsSize > 2) {
        if(strlen(tmpNums[tmpNumsSize - 1]) > (strlen(tmpNums[tmpNumsSize - 3]) + 1) && strlen(tmpNums[tmpNumsSize - 1]) > (strlen(tmpNums[tmpNumsSize - 2]) + 1)) {
            return false;
        }
    }

    //回溯
    if(isAdd(num, j + 1, tmpNums, tmpNumsSize)) {
        return true;
    }    
}

return false;

}

bool isAdditiveNumber(char * num){
if(num == NULL) {
return false;
}
int length = strlen(num);
if(length <= 2) {
return false;
}

//判断
bool result = isAdd(num, 0, NULL, 0);

return result;

}

发布了39 篇原创文章 · 获赞 1 · 访问量 856

猜你喜欢

转载自blog.csdn.net/weixin_42268479/article/details/104171372