《力扣题库(C):第17题 (电话号码的字母组合)》

第十七题:电话号码的字母组合

  • 给定一个仅包含数字 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'] 的一个数字。

解题:

/**
 * @file 17.cpp
 * @author HarkerYX
 * @brief  电话号码的字母组合
 * @version 0.1
 * @date 2021-05-02
 * 
 * @copyright Copyright (c) 2021
 * 
 */

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

解题思路:

要用到递归,一层层的去添写数据
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

char * map[] = {

    "abc",
    "def",
    "ghi",
    "jkl",
    "mno",
    "pqrs",
    "tuv",
    "wxyz"
};


void printfCombination(char **p,int size,int len)
{
    printf("总共%d组\n",size);
    // return;
    printf("[\n");

    for (int i = 0; i < size ;i++)
    {
        char *tmp = (char *)p[i];
        
        printf("[");
        for (int j = 0; j < len; j++)
            printf("%c",tmp[j]);
    
         printf("]\n");

    }

    printf("]\n");
}


char *head = NULL;

void test(char *subDigits,int maxlen,int index,int* returnSize,char **mapStr)
{
    //剩余字符串长度
    char *sub = subDigits;
    int len = strlen(sub);

    if(len==0)
        return;

    char *str = map[sub[0] - '2'];
    int maplen = strlen(str);

    char *tmp = NULL;


    // printf("maplen = %d \n",maplen);
    for (int i = 0; i < maplen; i++){

        //每次第一字符时候把index设置为0
        if(len == maxlen)
            index = 0;

        head[index] = str[i];

        //每次最后一个字符的时候分配空间,把第一个字符分配空间最后一个字符填充最后字符凑合完整的空间,拷贝给最后字符分配的空间
        //因为最后一个字符map有几种可能性
        tmp = sub+1;
        if(tmp[0] == '\0')
        {
            char *tail = (char *)malloc(sizeof(char) * (maxlen+1));
            tail[maxlen] = '\0';
            memcpy(tail,head,maxlen);
            // printf("tail = %s\n",tail);
            mapStr[*returnSize] = tail;
            (*returnSize)++;
        }
        else{
            index++;
            test(tmp,maxlen,index,returnSize,mapStr);     
            index--;   
        }
    }
}


/**
 * @brief 
 * 
 * @param digits 
 * @param returnSize 
 * @return char** 
 */
char ** letterCombinations(char * digits, int* returnSize,char **mapStr){

    int len = strlen(digits);

    //只分配一次专门用来保存中间过程组合
    head = (char *)malloc(sizeof(char) * len);

    printf("maxlen  = %d \n",len);
    test(digits,len,0,returnSize,mapStr);
}

//不考虑1情况
int main(void)
{
    char *s = "279";
    int returnSize = 0;

    //尽量分配大一点,长度<=4, 每个数字对应最长map 4个字符
    char **mapStr = (char **)malloc(sizeof(char *) * pow(4,4));

    letterCombinations(s, &returnSize,mapStr);
    printfCombination(mapStr,returnSize,strlen(s));
    return 0;
}
总共48组
[
[apw]
[apx]
[apy]
[apz]
[aqw]
[aqx]
[aqy]
[aqz]
[arw]
[arx]
[ary]
[arz]
[asw]
[asx]
[asy]
[asz]
[bpw]
[bpx]
[bpy]
[bpz]
[bqw]
[bqx]
[bqy]
[bqz]
[brw]
[brx]
[bry]
[brz]
[bsw]
[bsx]
[bsy]
[bsz]
[cpw]
[cpx]
[cpy]
[cpz]
[cqw]
[cqx]
[cqy]
[cqz]
[crw]
[crx]
[cry]
[crz]
[csw]
[csx]
[csy]
[csz]
]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HarkerYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值