这里主要是记录一些我做这个题遇到的问题及解决办法
1.问题描述
1.1 思路分析;
这个回溯法的关键是要理解递归,在递归的基础上再理解回溯法,尤其是当递归结束和循环结束后下一步应该运行到哪里?return可以返回到上一层递归,但是当最后循环结束时也能回到上一层递归,可以调试看看每一步运行过程
2.程序代码及注释:
2.1 C-回溯法-详细代码解释-暴力
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char* convert[] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; // 映射长度
char** ans;
char path[6];
int n, pathsize, anssize;
// 这种写法是错误的,全局变量是无法在定义以后赋值的,只能初始化赋值,否则会在编译阶段报错:
// int pathsize=0;
// int anssize=0;
// pathsize=0;
// anssize=0;
void backtracking(char* digits, int index) {
if (index == strlen(digits)) {
// 保存结果,先申请一下临时内存(一级指针),每次都要申请一个,用于保存结果,然后用二级指针指向这个结果
//这里不能用全局变量字符串数组,必须动态的每次进行申请内存
char* temp = (char*)malloc(sizeof(char) *(n + 1)); // 明确为什么是n+1;因为最后一位要存'\0',也就是成为字符串;
for (int i = 0; i < strlen(digits); i++)temp[i] = path[i];
temp[index] = '\0';
ans[anssize++] = temp;
return;
}
char* letter = convert[digits[index] - '0'];
for (int i = 0; i < strlen(letter); i++) {
path[pathsize++] = letter[i];
backtracking(digits, index + 1);
pathsize--; // return 后函数第一条执行的语句
// for循环结束后,自动返回到上一层函数,返回上一层函数后继续执行pathsize--,也就是执行了两次pathsize--
// 第一次是最后return后, pahouthsize--,pathsize==2;
// 第二次是最后一次递归循环中i==3,结束最后一次递归,返回第二次递归,因此从pathsize--开始执行
// pathsize==1,也就是相当于退回嵌套循环的倒数第二次循环;
}
}
char** letterCombinations(char* digits, int* returnSize) {
n = strlen(digits);
ans = (char**)malloc(sizeof(char*) * 300);
//path = (char*)malloc(sizeof(char) * n); // 临时保存每次结果,可以申请内存,也可以直接定义个全局字符串数组变量,长度>=6即可
anssize = pathsize = 0;
if (n == 0) {
*returnSize = 0;
return ans;
}
backtracking(digits, 0);
*returnSize = anssize;
return ans;
}