*的字母组合

/*
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
*/
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include <iostream>
typedef struct Hash{
    char ch;
    int iLen;
    char data[5];
}HASH;

HASH Hash[10]={
    '0',  0, "",
    '1',  3, "!@#",
    '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 JudgeInput(char* pInput,int* pRangeNum){
    int iRange=1,numSize,i=0,iLen=0;
    while(pInput[i]!=''){
        if(pInput[i]>='2'&&pInput[i]<='9'){
            iRange*=Hash[pInput[i]-'0'].iLen;
            i++;
            iLen++;
        }else{
            iLen=0;
            break;
        }
    }
    *pRangeNum = iRange;
    return iLen;
}

char ** letterCombinations(char* digits, int* returnSize){
    char **ppRet;
    int numsSize,i,j,k,numsRange,interval;
    numsSize = JudgeInput(digits,&numsRange);
    ppRet=(char**)malloc(sizeof(char*)*numsRange);
    interval=numsRange;
    k=numsRange;
    * returnSize=numsRange;

    if(numsSize<=0){
        *returnSize=0;
        return NULL;
    }

    printf("[2] numsSize=%d iRangeNum=%d
",numsSize,numsRange);

    for(i=0;i<numsSize;i++){
        k=Hash[digits[i]-'0'].iLen;
        interval/=k;
        for(j=0;j<numsRange;j++){
            if(i==0){
                ppRet[j]=(char*)malloc(sizeof(char)*(numsSize+1));
                ppRet[j][numsSize]='';
            }
            ppRet[j][i] = Hash[digits[i]-'0'].data[(j/interval)%k];
            printf("[3] i=%d j=%d k=%d ppRet=%c
",i,j,k,ppRet[j][i]);
        }
    }
    return ppRet;
}
int main()
{
    char digits[]={'2','3'};
    char **ppRet;
    int* returnSize;
    ppRet = letterCombinations(digits,returnSize);
    return 0;
}
原文地址:https://www.cnblogs.com/zhaohuan1996/p/12613816.html