int* path;
int pathTop;
int** ans;
int ansTop;
void backtracking(int targetSum, int k, int sum, int startIndex) {
if(pathTop == k) {
if(sum == targetSum) {
int* tempPath = (int*)malloc(sizeof(int) * k);
int j;
for(j = 0; j < k; j++)
tempPath[j] = path[j];
ans[ansTop++] = tempPath;
}
return;
}
int i;
for (i = startIndex; i <= 9; i++) {
sum += i;
path[pathTop++] = i;
backtracking(targetSum, k, sum, i + 1);
sum -= i;
pathTop--;;
}
}
int** combinationSum3(int k, int n, int* returnSize, int** returnColumnSizes){
path = (int*)malloc(sizeof(int) * k);
ans = (int**)malloc(sizeof(int*) * 20);
pathTop = ansTop = 0;
backtracking(n, k, 0, 1);
*returnSize = ansTop;
*returnColumnSizes = (int*)malloc(sizeof(int) * ansTop);
int i;
for(i = 0; i < ansTop; i++) {
(*returnColumnSizes)[i] = k;
}
return ans;
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char* path;
int pathTop;
char** ans;
int ansTop;
char* letterMap[10] = {
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
void backTracking(char* digits, int index) {
if (index == strlen(digits)) {
char* temp = (char*)malloc(sizeof(char) * (strlen(digits) + 1));
int j;
for (j = 0; j < strlen(digits); j++) {
temp[j] = path[j];
}
temp[strlen(digits)] = '\0';
ans[ansTop++] = temp;
return;
}
int digit = digits[index] - '0';
char* letters = letterMap[digit];
int i;
for (i = 0; i < strlen(letters); i++) {
path[pathTop++] = letters[i];
backTracking(digits, index + 1);
pathTop--;
}
}
char** letterCombinations(char* digits, int* returnSize) {
*returnSize = 0;
if (strlen(digits) == 0) {
return ans;
}
path = (char*)malloc(sizeof(char) * strlen(digits));
ans = (char**)malloc(sizeof(char*) * 300);
pathTop = ansTop = 0;
backTracking(digits, 0);
*returnSize = ansTop;
return ans;
}
其实这个大体和组合这个问题差不多,这里其实将一个完整的数组分成了不同的数组,然后根据题目的要求,选择出相应的数组
这里的难点就是如何有字符串和如何将数字与字符链接起来,变成一个数组