【刷题打卡记录】力扣17. 电话号码的字母组合
/**
- Note: The returned array must be malloced, assume caller calls free().
*/
#define LEN 300
int g_len;
char **res;
char *path;
int ansSize;
int pathSize;
char g_map[10][5] = {
“”, “”, “abc”, “def”, “ghi”, “jkl”, “mno”, “pqrs”, “tuv”, “wxyz”
};
void backTrace(int idx, char *digits)
{
if (idx == g_len) {
char *tmp = (char *)malloc(sizeof(char) * (g_len + 1));
for (int i = 0; i < g_len; i++) {
tmp[i] = path[i];
}
tmp[g_len] = 0;
res[ansSize++] = tmp;
return;
}
char *words = g_map[digits[idx]- ‘0’];
for (int j = 0; j < strlen(words); j++) {
path[pathSize++] = words[j];
backTrace(idx+1, digits);
pathSize–;
}
}
char ** letterCombinations(char * digits, int* returnSize){
int len = strlen(digits);
g_len = len;
ansSize = pathSize = 0;
res = (char **)malloc(sizeof(char *) * LEN);
path = (char *)malloc(sizeof(char) * len);
*returnSize = 0;
if (len == 0) {
return res;
}
backTrace(0, digits);
*returnSize = ansSize;
return res;
}
注意点:
1、回溯的时候,我最开始的做法是吧path直接作为参数放到backtrace函数入参里的,然后通过判断path的长度来作为退出条件的,这种做法不太好,因为在最后回溯的时候,要回退最后新增的一个字符,不是很好操作,所以以后这种用临时字符串存储一个结果的时候,最好是用他的长度来作为回溯时操作的元素,就像上述代码里的pathsize,这样就会简单很多。
2、strlen、sizeof,不必多言,肯定是要搞清楚的。注意一点:创建char数组来表示字符串的时候,切记要多留一个位置来给最后的’\0’,同时赋值的时候也不要忘记了最后的结束符。
3、这个题目里面我写了很多全局变量,这是为了在回溯的时候尽量少的传参数,让回溯函数更简单。
4、力扣有一个毛病,就是全局变量在声明的时候不能直接赋值,否则会报错。所以就在最开始函数里面初始化它就行了。