力扣 17.电话号码的字母组合(C语言)

力扣 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'] 的一个数字。

思路

采用深度优先搜索的方式来获得每一中组合,如下图

在这里插入图片描述

如图我们可知道需要一个关于每个数字代表的字母字符串的地图

//用于存放每个数字所对应的字母字符串
char phoneMap[10][5] = {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};

代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char phoneMap[10][5] = {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};
//用于存放组合字符串
char ** returnstr;
int returnstr_size;
//用于存放单个字符串
char * str;
int str_size;
//号码长度
int n;
void DFS(int index,char * digits)
{
    if(index == n)
    {
        //用于存放组合
        char *temp=(char*)malloc(sizeof(char)*(n+1));
        //讲str里的组合存入temp中
        for(int i = 0;i<n;i++)
            temp[i] = str[i];
        temp[n] = '\0';
        //将temp的地址存入returnstr里
        returnstr[returnstr_size++] = temp;
        return;
    }
    //指向每个数字所对的字符串的首地址
    char * phoneMap_str = phoneMap[digits[index] - '0'];
    for(int i = 0;i<strlen(phoneMap_str);i++)
    {
        str[str_size++] = phoneMap_str[i];
        DFS(index+1,digits);
        //需要将坐标相对应-1,并不可以归0,归0会导致后续组合所对应的下标出现问题,
        //例如“ad”,在d位置归0的话,DFS还是在"a"下需要,但这是的下标变为了0,就会导致后续的‘e’将“a”覆盖为“e”。
        str_size --;
    }
}

char** letterCombinations(char* digits, int* returnSize) 
{
    //获取号码长度
    n = strlen(digits);
    //号码为空,直接返回NULL
    if(n == 0)
    {
        *returnSize = 0;
        return NULL;
    }
    //算出所有组合,用于确定returnstr的大小
    char * p = digits;
    int sum = 1;
    while(*p)
    {
        if('7' == *p || '9' == *p)
            sum *= 4;
        else
            sum *= 3;
        p++;
    }
    //分配字符串空间
    returnstr = (char **)malloc(sizeof(char *) * sum);
    str = (char *)malloc(sizeof(char) * n);
    //**********注意***********必须写在函数内,不可通过全局变量来定义
    returnstr_size = str_size = 0;
    //递归来获取所有组合
    DFS(0,digits);
    //返回大小
    *returnSize =returnstr_size;
    return returnstr;
}

注意!

1.变量returnstr_size,str_size需要在函数内定义为 0,不可以使用全局变量初始化时直接定义为 0。

(否则会导致多次测试该代码时,变量returnstr_size和变量str_size初始值不为 0)

2.在第35行中str_size --;不可以直接归 0

(归0会导致后续组合所对应的下标出现问题)
例如:若现在“ad”已经存入temp中,此时str_size为 1,然后我们将str_size进行归0,就会使后续本为“ae”的组合变为“e”,即e 将 a 覆盖

3.在对returnstr和temp分配空间时,注意空间要足够大

temp需要分配的空间大小为strlen(digits) + 1;这里我对returnstr所需要分配的空间进行了计算,故不需用管,若是不想计算确定值,一定分配要足够大





题目来源:

力扣 17题

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值