第十七题:电话号码的字母组合
- 给定一个仅包含数字 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'] 的一个数字。
解题:
/**
* @file 17.cpp
* @author HarkerYX
* @brief 电话号码的字母组合
* @version 0.1
* @date 2021-05-02
*
* @copyright Copyright (c) 2021
*
*/
/*
第十七题:电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
解题思路:
要用到递归,一层层的去添写数据
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
char * map[] = {
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
void printfCombination(char **p,int size,int len)
{
printf("总共%d组\n",size);
// return;
printf("[\n");
for (int i = 0; i < size ;i++)
{
char *tmp = (char *)p[i];
printf("[");
for (int j = 0; j < len; j++)
printf("%c",tmp[j]);
printf("]\n");
}
printf("]\n");
}
char *head = NULL;
void test(char *subDigits,int maxlen,int index,int* returnSize,char **mapStr)
{
//剩余字符串长度
char *sub = subDigits;
int len = strlen(sub);
if(len==0)
return;
char *str = map[sub[0] - '2'];
int maplen = strlen(str);
char *tmp = NULL;
// printf("maplen = %d \n",maplen);
for (int i = 0; i < maplen; i++){
//每次第一字符时候把index设置为0
if(len == maxlen)
index = 0;
head[index] = str[i];
//每次最后一个字符的时候分配空间,把第一个字符分配空间最后一个字符填充最后字符凑合完整的空间,拷贝给最后字符分配的空间
//因为最后一个字符map有几种可能性
tmp = sub+1;
if(tmp[0] == '\0')
{
char *tail = (char *)malloc(sizeof(char) * (maxlen+1));
tail[maxlen] = '\0';
memcpy(tail,head,maxlen);
// printf("tail = %s\n",tail);
mapStr[*returnSize] = tail;
(*returnSize)++;
}
else{
index++;
test(tmp,maxlen,index,returnSize,mapStr);
index--;
}
}
}
/**
* @brief
*
* @param digits
* @param returnSize
* @return char**
*/
char ** letterCombinations(char * digits, int* returnSize,char **mapStr){
int len = strlen(digits);
//只分配一次专门用来保存中间过程组合
head = (char *)malloc(sizeof(char) * len);
printf("maxlen = %d \n",len);
test(digits,len,0,returnSize,mapStr);
}
//不考虑1情况
int main(void)
{
char *s = "279";
int returnSize = 0;
//尽量分配大一点,长度<=4, 每个数字对应最长map 4个字符
char **mapStr = (char **)malloc(sizeof(char *) * pow(4,4));
letterCombinations(s, &returnSize,mapStr);
printfCombination(mapStr,returnSize,strlen(s));
return 0;
}
总共48组
[
[apw]
[apx]
[apy]
[apz]
[aqw]
[aqx]
[aqy]
[aqz]
[arw]
[arx]
[ary]
[arz]
[asw]
[asx]
[asy]
[asz]
[bpw]
[bpx]
[bpy]
[bpz]
[bqw]
[bqx]
[bqy]
[bqz]
[brw]
[brx]
[bry]
[brz]
[bsw]
[bsx]
[bsy]
[bsz]
[cpw]
[cpx]
[cpy]
[cpz]
[cqw]
[cqx]
[cqy]
[cqz]
[crw]
[crx]
[cry]
[crz]
[csw]
[csx]
[csy]
[csz]
]