C练题笔记之:Leetcode-17. 电话号码的字母组合

该博客详细介绍了LeetCode第17题的解题过程,即如何根据数字生成电话号码的字母组合。通过使用C语言,博主解析了题意,明确了数字与字母的映射,并提供了递归解决方案,解释了如何构建二维数组存储结果。文章以示例输入输出、解题思路和关键代码为主要内容。

题目:

给定一个仅包含数字 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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值