题目:
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
结果:

解题思路:
首先,这题我需要明白的几点:
1、用MAP存储每一个数字对应的字母,count存储每一个数字对应字母个数。
2、二维数组的长度:应该是digits对应位置字符多少相乘的结果。
如:digits = { 2,3,4}
那么我们能获取到二维数组的长度是2对应的字母个数和3对应的字母个数和4对应的字母个数相乘的结果。也就是等于count [ 2 ] * count [ 3 ] * count [ 3 ]
3、每个一维数组的长度。因为digits下每一个数字只取一个字母,因此以为数组的成都等于digiths的长度 + 1。这个1是用于存储 ’\0‘的。
如:digits = { 2, 3, 4}的情况下
行:count [ 2 ] * count [ 3 ] * count [ 3 ]个。
列:len+1个
再用一个str存储每一次能存储的数据。递归
如:digits = { 2,3,4}
那么能取的字母是 “def", "ghi", "jkl",对应的第一列只能取def,第二列是ghi,第三列是jkl。剩下的就是递归获取,str存储数据
str[0][0] = d || e || f,
str[0][1] = g || h || i,
str[0][2] = j || k || l,
每一次当递归到index 等于 digitslen的时候说明现在在第四列,这一列说明当前一组取完值了。需要存一个’\0‘进去,然后strcpy到我们返回的二维数组中,作为其中一个一位数组存在。
代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char MAP[10][5] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
int count[10] = {0, 0, 3, 3, 3, 3, 3, 4, 3, 4};
// index: 层数,也就是digits中第几个。
// str:用于存储这一次目前位置存储的字符。也就是retArr的每一行数据存储用。
void Fun(char **retArr, char *digits, int digitsLen, int index, int *num, char *str) {
if (index == digitsLen) {
str[index] = '\0';
strcpy(retArr[*num], str);
*num += 1;
return;
}
int temp = digits[index] -'0';
for (int i = 0; i < count[temp]; i++) {
str[index] = MAP[temp][i];
Fun(retArr, digits, digitsLen, index + 1, num, str);
}
}
char ** letterCombinations(char * digits, int* returnSize){
int len = strlen(digits);
if (len == 0) {
*returnSize = 0;
return NULL;
}
*returnSize = 1;
for (int i = 0; i < len; i++) {
int temp = digits[i] - '0';
*returnSize *= count[temp];
}
char **retArr = (char **)malloc(sizeof(char *) * (*returnSize));
//初始化retArr
for (int i = 0; i < (*returnSize); i++) {
retArr[i] = (char *)malloc(sizeof(char) * (len + 1));
retArr[i][len] = '\0';
}
int index = 0; //当前层数
int num = 0;
char str[5] = {};
Fun(retArr, digits, len, index, &num, str);
return retArr;
}
该博客详细介绍了LeetCode第17题的解题过程,即如何根据数字生成电话号码的字母组合。通过使用C语言,博主解析了题意,明确了数字与字母的映射,并提供了递归解决方案,解释了如何构建二维数组存储结果。文章以示例输入输出、解题思路和关键代码为主要内容。
397

被折叠的 条评论
为什么被折叠?



