leetcode-电话号码组合(C CODE)

1. 题目

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

2. 编程实现

2.1 思路

  1. 如果输入长度为0,直接返回,没有排列组合;
  2. 如果输入长度是1,那么直接就找对应按键上边的字母输出;
  3. 如果输入长度大于1,例如是2

两个数字的排列组合

可以定义一个map表,把字母与数组做一个关系对应

如:

c 复制代码
typedef struct {
	int num;
	char character[5];
} map_t;

map_t map[10] = {
	{0, {}},
	{1, {}},
	{3, {'a','b','c'}},
	{3, {'d','e','f'}},
	{3, {'g','h','i'}},
	{3, {'j','k','l'}},
	{3, {'m','n','o'}},
	{4, {'p','q','r','s'}},
	{3, {'t','u','v'}},
	{4, {'w','x','y','z'}},
}

2.2 编程实现

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int num;
    char letters[5];
} map_t;

map_t map[10] = {
    {0, {}},
    {1, {}},
    {2, {'a', 'b', 'c'}},
    {3, {'d', 'e', 'f'}},
    {4, {'g', 'h', 'i'}},
    {5, {'j', 'k', 'l'}},
    {6, {'m', 'n', 'o'}},
    {7, {'p', 'q', 'r', 's'}},
    {8, {'t', 'u', 'v'}},
    {9, {'w', 'x', 'y', 'z'}},
};

void generateCombinations(char* digits, int index, char* current, char** result, int* count) {
    if (digits[index] == '\0') {
        current[index] = '\0';
        result[(*count)] = strdup(current);
        (*count)++;
    } else {
        int digit = digits[index] - '0';
        for (int i = 0; i < map[digit].num; i++) {
            current[index] = map[digit].letters[i];
            generateCombinations(digits, index + 1, current, result, count);
        }
    }
}

char** letterCombinations(char* digits, int* returnSize) {
    int len = strlen(digits);
    char** result = (char**)malloc(sizeof(char*) * 10000);
    *returnSize = 0;

    if (len == 0) {
        return result;
    }

    char current[5] = {0};
    generateCombinations(digits, 0, current, result, returnSize);

    return result;
}

int main() {
    char* digits = "23"; // 你可以修改这里的输入数字字符串
    int returnSize;
    char** result = letterCombinations(digits, &returnSize);

    for (int i = 0; i < returnSize; i++) {
        printf("%s\n", result[i]);
        free(result[i]);
    }

    free(result);
    return 0;
}
相关推荐
代码雕刻家1 小时前
2.4.蓝桥杯-分巧克力
算法·蓝桥杯
Ulyanov1 小时前
顶层设计——单脉冲雷达仿真器的灵魂蓝图
python·算法·pyside·仿真系统·单脉冲
请注意这个女生叫小美2 小时前
C语言 斐波那契而数列
c语言
Legendary_0082 小时前
Type-C 一拖二快充线:突破单口限制的技术逻辑
c语言·开发语言
智者知已应修善业2 小时前
【查找字符最大下标以*符号分割以**结束】2024-12-24
c语言·c++·经验分享·笔记·算法
91刘仁德3 小时前
c++类和对象(下)
c语言·jvm·c++·经验分享·笔记·算法
diediedei3 小时前
模板编译期类型检查
开发语言·c++·算法
阿杰学AI3 小时前
AI核心知识78——大语言模型之CLM(简洁且通俗易懂版)
人工智能·算法·ai·语言模型·rag·clm·语境化语言模型
mmz12073 小时前
分治算法(c++)
c++·算法
睡一觉就好了。4 小时前
快速排序——霍尔排序,前后指针排序,非递归排序
数据结构·算法·排序算法