电话号码的字母的组合

给定一个仅包含数字 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!='\0'){
            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]!='\0'){
        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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted on 2020-03-07 21:52  PigDragon  阅读(433)  评论(0编辑  收藏  举报