Backtracking
Backtracking
void backtrack(char **result, char *digits, char *tmp, int index, int *resLen)
{
if (index == strlen(digits)) {
tmp[index] = '\0';
result[(*resLen)] = (char *)malloc(strlen(tmp) + 1);
strcpy(result[(*resLen)], tmp);
(*resLen)++;
return;
}
char *possibleLetters = letters[digits[index] - '0' - 2];
for (int i = 0; i < strlen(possibleLetters); i++) {
tmp[index] = possibleLetters[i];
backtrack(result, digits, tmp, index + 1, resLen);
}
}
2. Generate Parenthesis
void backtrack(char **result, char *tmp, int open, int close, int max, int idx,
int *resLen);
char ** generateParenthesis(int n, int* returnSize){
void backtrack(char **result, char *tmp, int open, int close, int max, int idx,
int *resLen){
if (idx == max * 2) {
tmp[idx] = '\0';
result[(*resLen)] = (char *)malloc(strlen(tmp) + 1);
strcpy(result[(*resLen)], tmp);
(*resLen)++;
return;
}
if (open < max) {
tmp[idx] = '(';
//idx++;
backtrack(result, tmp, open+1, close, max, idx+1, resLen);
}
if (close < open) {
tmp[idx] = ')';
//int idx++;
backtrack(result, tmp, open, close+1, max, idx+1, resLen);
}
}
3. Permutations
void backtrack(int* nums, int numsSize, int **output, int *count, int first,
int** returnColumnSizes){
if(first == numsSize){
output[*count] = (int *)malloc(sizeof(int) * numsSize);
memcpy(output[*count], nums, numsSize * sizeof(int));
*returnColumnSizes = realloc(*returnColumnSizes, sizeof(int) * (*count
+ 1));
(*returnColumnSizes)[*count]=numsSize;
(*count)++;
}
for(int i = first; i < numsSize; i++){
swap(&nums[first], &nums[i]);
backtrack(nums, numsSize, output, count, first + 1, returnColumnSizes);
swap(&nums[first], &nums[i]);
}
}
int** permute(int* nums, int numsSize, int* returnSize, int**
returnColumnSizes){
int **output = NULL;
int **rerurnColumnSizes = NULL;
int count = 0;
*returnSize = count;
if(!nums)
return output;
void backtrack(int* nums, int numsSize, int** res, int* returnSize, int**
returnColumnSizes, int* tmp, int tarSize, int cidx, int start) {
if (cidx == tarSize) {
(*returnColumnSizes)[(*returnSize)] = cidx;
res[(*returnSize)] = (int*) malloc(cidx * sizeof(int));
if (tarSize) memcpy(res[(*returnSize)], tmp, cidx * sizeof(int));
(*returnSize)++;
} else {
for (int i = start; i < numsSize; i++) {
tmp[cidx] = nums[i];
backtrack(nums, numsSize, res, returnSize, returnColumnSizes, tmp,
tarSize, cidx + 1, i + 1);
}
}
}
int ROWS;
int COLS;
bool backtrack(char **board, int row, int col, char* word, int index) {
/* Step 1). check the bottom case. */
if (index >= strlen(word))
return true;