【C语言】Leetcode 17. 电话号码的字母组合

解题思路:
一、电话号码使用一个hash表,直接经过hash表格,获得数字对应的字符已经长度。
二、经过数字的个数digitsLen,求出实际的输出的字符串数组的长度*returnSize;
三、数字长度循环,而后经过j的循环,经过每一个数字将相关的字符遍历一遍。越日后的interval越小。
res[j][i] = g_hash[digits[i] - ‘0’].c[j / interval % k];git

https://leetcode-cn.com/submissions/detail/60114586/
给定一个仅包含数字 2-9 的字符串,返回全部它能表示的字母组合。
给出数字到字母的映射以下(与电话按键相同)。注意 1 不对应任何字母。web

typedef struct{
    char cNum;
    int iLen;
    char c[5];
} HASH;

HASH g_hash[10] = {
    '0', 0, "",
    '1', 0, "",
    '2', 3, "abc",
    '3', 3, "def",
    '4', 3, "ghi",
    '5', 3, "jkl",
    '6', 3, "mno",
    '7', 4, "pqrs",
    '8', 3, "tuv",
    '9', 4, "wxyz"
};

int cntOfRet(char *digits){
    int len = strlen (digits);
    int res = 1;
    for(int i = 0; i < len; i++){
        res *= g_hash[digits[i] - '0'].iLen;
    }
    return res;
}

char ** letterCombinations(char * digits, int* returnSize){
    int digitsLen = strlen(digits);
    if(digitsLen == 0){
        *returnSize = 0;
        return NULL;
    }
  
    *returnSize = cntOfRet(digits);
    char ** res = (char **) malloc(*returnSize * sizeof(char *));
    int interval = *returnSize;

    for(int i = 0; i < digitsLen; i++){
        int k = g_hash[digits[i] - '0'].iLen;
        interval /= k;
        
        for(int j = 0; j < *returnSize; j++){
            if(i == 0){
                res[j] = (char *) malloc (digitsLen + 1);
                res[j][digitsLen] = '\0';
            }
            res[j][i] = g_hash[digits[i] - '0'].c[j / interval % k];
        }
    }
    return res;
}