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;
}
相关推荐
_GR7 分钟前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
凯子坚持 c9 分钟前
C语言复习概要(三)
c语言·开发语言
ROBIN__dyc19 分钟前
表达式
算法
无限大.20 分钟前
c语言200例 067
java·c语言·开发语言
无限大.23 分钟前
c语言实例
c语言·数据结构·算法
Death20026 分钟前
Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
c语言·开发语言·c++·qt·c#
六点半88827 分钟前
【C++】速通涉及 “vector” 的经典OJ编程题
开发语言·c++·算法·青少年编程·推荐算法
@haihi36 分钟前
冒泡排序,插入排序,快速排序,选择排序
数据结构·算法·排序算法
quaer39 分钟前
Open-Sora全面开源?
开发语言·算法·机器学习·matlab·矩阵
Hello.Reader1 小时前
TopK算法在大数据重复数据分析中的应用与挑战
大数据·算法·数据分析