電話號碼的字母組合
阿新 • • 發佈:2018-07-18
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"].
電話號碼的字母組合