电话号码的字母组合
/* 给定一个仅包含数字 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; }