给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
方法一:
解题思路:
(1)首先建立一个映射关系表,将2-9之前的数字对应的字符串依依映射;
(2)将已经找到的字母的组合与新的数字对应的字符串,进行组合,产生新的字母组合
依次遍历直到键所有的数字都遍历完毕
(3)其中需要对字符串为空,以及处理第一个字母的情况进行特殊的处理,其他的逻辑都是一致的。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char ** combinations(char ** string, char * ptr, int *num){
char ** ret_string=NULL;
int ii=0;
if(*num==0 || string==NULL){ // 还没有产生任何字母组合,第一个数字的情况
int ptr_len=strlen(ptr);
ret_string=malloc(sizeof(char *)*ptr_len);
for(;ii<ptr_len;ii++){
ret_string[ii]=malloc(sizeof(char)*2);
memset(ret_string[ii], 0, sizeof(char)*2);
ret_string[ii][0]=ptr[ii];
}
*num=ptr_len;
return ret_string;
}
int old_string_len=strlen(string[0]);
int num_combination=strlen(ptr)*(*num);
ret_string=malloc(sizeof(char *)*num_combination);
int each_string_len=old_string_len+2;
ii =0;
for(;ii<num_combination;ii++){
ret_string[ii]=malloc(each_string_len);
memset(ret_string[ii], 0, each_string_len);
}
ii=0;
int count=0;
for(;ii<*num;ii++){
// 将之前所有老的字母组合与新的字符串的每一个字符进行组合,产生新的排列组合
char * tmp_ptr=ptr;
while(*tmp_ptr!=' '){
memcpy(ret_string[count], string[ii], old_string_len);
ret_string[count][old_string_len]=*tmp_ptr;
count++;
tmp_ptr++;
}
}
//释放之前的内存,将新的组合返回
ii=0;
for(;ii<*num; ii++){
free(string[ii]);
}
free(string);
*num=count;
return ret_string;
}
char **letterCombinations(char *digits, int *returnSize){
char *string[]={"","", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
char *tmp_string=NULL;
char **ret_string=NULL;
int count=0;
int digits_len=strlen(digits);
if(digits_len==0){
// 为空直接返回
*returnSize=0;
return ret_string;
}
int ii=0;
while(digits[ii]!=' '){
int num=digits[ii]-'0';
char * ptr=string[num];
ret_string=combinations(ret_string, ptr, &count);
//调用接口,循环遍历每次都将之前的组合,新的字符串,之前的组合中有多少个可能作为参数传入,然后将新生成的组合与新组合中有多少种可能传出
ii++;
}
*returnSize=count;
return ret_string;
}
该算法的时间复杂度为O(3^N*4^M), 其中的N是对应字母为三个的数字的个数, M是对应字母为四个的数字的个数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。