解题思路:
一、电话号码使用一个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; }