/*
给定一个仅包含数字 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]!='\0'){
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\n",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]='\0';
}
ppRet[j][i] = Hash[digits[i]-'0'].data[(j/interval)%k];
printf("[3] i=%d j=%d k=%d ppRet=%c\n",i,j,k,ppRet[j][i]);
}
}
return ppRet;
}
int main()
{
char digits[]={'2','3'};
char **ppRet;
int* returnSize;
ppRet = letterCombinations(digits,returnSize);
return 0;
}