zl程序教程

您现在的位置是:首页 >  其它

当前栏目

17. 电话号码的字母组合

17 电话号码
2023-09-14 09:06:53 时间

17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

在这里插入图片描述

示例 1:

输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]

示例 2:

输入:digits = “”
输出:[]

示例 3:

输入:digits = “2”
输出:[“a”,“b”,“c”]

解题代码如下:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char map[10][5] = {"\0","\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};

void f(char **re,int po,int size,int len,char * digits,int min,int max){
  
    if(size<len){
      //  printf("size %d ",size);
     int i=0;
    if(digits[po]!='\0'){

   
    int index=digits[po]-'0';
   
    int strl=strlen(map[index]);
    int poz=min;
    int num=(max-min)/strl;
    int j;
   for(i=0;i<strl;i++){
     char ch=map[index][i];
     for(j=poz;j<poz+num;j++){
     //    printf("%d ",j);
         re[j][size]=ch;
         if(size==len-1){
            // printf("size %d ",size);
             re[j][size+1]='\0';
         }
       }

       f(re,po+1,size+1,len,digits,poz,poz+num);
     poz=poz+num;
   }
    }
     }

}

char ** letterCombinations(char * digits, int* returnSize){
  
    int max=1;
   int  i=0;
   if(strlen(digits)==0){
       * returnSize=0;
       return digits;

   }
    while(digits[i]!='\0'){
        int index=digits[i]-'0';
        max=max*strlen(map[index]);
        i++;
    }
    int len=i;
    char **re=(char **)malloc(sizeof(char *)*max);
    for(i=0;i<max;i++){
        re[i]=(char *)malloc(sizeof(char)*(len+1));
    }
     if(strlen(digits)==1){
     for(i=0;i<max;i++){
           int index=digits[0]-'0';
           re[i][0]= map[index][i];
           re[i][1]='\0';

    }
    * returnSize=max;
    return re;
       
   }
f(re,0,0,len,digits,0,max);

* returnSize=max;
return re;
    

}