1. 程式人生 > >電話號碼的字母組合

電話號碼的字母組合

returns free amp 後來 gin all 賦值 load 技術分享

給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。

給出數字到字母的映射如下(與電話按鍵相同)。註意 1 不對應任何字母。

技術分享圖片

示例:

輸入:"23"
輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

思路是回溯+遞歸,利用一個棧來存儲字母。

具體實現就是,先用叠代存儲一個字母,如果棧沒滿就遞歸並叠代存儲字母,直到棧滿再把棧裏的內容扔到返回數組裏,或者某個字母已經遞歸完了所有後續,就回到了上一層遞歸函數,把這個用過的字母pop出去,繼續叠代 遞歸。

這裏有個巨幾把惡心的坑,就是我為少寫幾個參數在combine裏用了static修飾的top和size,如果只測試一次,確實是沒問題的,但是多測試幾次就傻逼了啊!!!一開始我用了strcpy,給我報了個執行錯誤,特麽地根本沒頭緒好嗎,後來我自己寫了個賦值,報了個空指針錯誤,媽的空你妹啊!!!還好聰明機智的我,最後還是發現了問題所在,花了快1小時的時間找一個“不存在的錯誤”。。。MMP。。。

唉,回想起來,以前總看見提示說什麽什麽,可能是你使用C/C++的全局變量,特麽地我現在是真的印象深刻了!!!

/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
char *letter[]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
int num[10]={0,0,3,3,3,3,3,4,3,4};
void combine(char** a,char
* s,char* digits,int index,int len,int* top,int* size) { if(index==len) { int i; for(i=0;i<len;i++) a[*size][i]=s[i]; a[*size][i]=\0; (*size)++; return ; } int i,pos=digits[index]-0; for(i=0;i<num[pos];i++) { s[(
*top)++]=letter[pos][i]; combine(a,s,digits,index+1,len,top,size); (*top)--; } } char** letterCombinations(char* digits, int* returnSize) { if(!*digits) return NULL; int len=strlen(digits); int i,size=1; for(i=0;i<len;i++) size*=num[(digits[i]-0)]; *returnSize=size; char **a=(char **)malloc(sizeof(char *)*size); len++; for(i=0;i<size;i++) a[i]=(char *)malloc(sizeof(char)*len); char *s=(char *)malloc(sizeof(char)*len); len--; int top=0,rear=0; combine(a,s,digits,0,len,&top,&rear); return a; }

給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。

給出數字到字母的映射如下(與電話按鍵相同)。註意 1 不對應任何字母。

技術分享圖片

示例:

輸入:"23"
輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

電話號碼的字母組合