解题思路:
1、电话号码使用一个hash表,直接通过hash表格,得到数字对应的字符已经长度。
2、通过数字的个数digitsLen,求出实际的输出的字符串数组的长度*returnSize;
3、数字长度循环,然后通过j的循环,通过每个数字将相关的字符遍历一遍。越往后的interval越小。
res[j][i] = g_hash[digits[i] - ‘0’].c[j / interval % k];
https://leetcode-cn.com/submissions/detail/60114586/
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
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;
}