回溯法——20200106

烈酒焚心 提交于 2020-01-10 04:53:12

6 Leetcode1239.串联字符串的最大长度
6.1 题目描述
给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串,如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。
请返回所有可行解 s 中最长长度。

示例 1:
输入:arr = [“un”,“iq”,“ue”]
输出:4
解释:所有可能的串联组合是 “”,“un”,“iq”,“ue”,“uniq” 和 “ique”,最大长度为 4。

示例 2:
输入:arr = [“cha”,“r”,“act”,“ers”]
输出:6
解释:可能的解答有 “chaers” 和 “acters”。

示例 3:
输入:arr = [“abcdefghijklmnopqrstuvwxyz”]
输出:26

提示:
1 <= arr.length <= 16
1 <= arr[i].length <= 26
arr[i] 中只含有小写英文字母
6.2 分析
回溯法,分为使用当前的和不使用当前的两种。
6.3 代码
#define MAX_LEN 420

bool isRepeat(char* str) {
if(str == NULL || strlen(str) == 0) {
return false;
}
int strLen = strlen(str);
int i = 0;
int cnt[26] = {0};
for(i = 0; i < strLen; i++) {
cnt[str[i] - ‘a’]++;
if(cnt[str[i] - ‘a’] > 1) {
return true;
}
}

return false;

}

int getMax(char**arr, int index, char* str, int* max) {
bool strRepeat = isRepeat(str);

if(strRepeat) {
    return;
}

if(index < 0) {
    if(!strRepeat) {
        *max = *max > strlen(str) ? *max : strlen(str);
    }
    return;
}

//不加当前的
getMax(arr, index - 1, str, max);

//加上当前的
char tmpStr[MAX_LEN] = ""; //这里可以用临时变量,这样就不用使用了之后在恢复
strcpy(tmpStr, str);
strcat(tmpStr, arr[index]);
getMax(arr, index - 1, tmpStr, max);

}

int maxLength(char ** arr, int arrSize){
int* max = (int*)malloc(sizeof(int));
if(max == NULL) {
return 0;
}
*max = 0;

char tmpStr[MAX_LEN] = "";
getMax(arr, arrSize - 1, tmpStr, max);

int result = *max;
free(max);
max = NULL;
return result;

}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!