vector<string> letterCombinations(string digits) { // Start typing your C/C++ solution below // DO NOT write int main() function int letters[26] = {2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9}; results.clear(); vector<char> result; doCombine(letters, result, digits, 0); return results; }
void doCombine(int letters[], vector<char> &result, string digits, int index) { if (index == digits.size()) { string str(result.begin(), result.end()); results.push_back(str); } for (int i = 0; i < 26; i++) { if (letters[i] == digits[index] - '0') { result.push_back('a' + i); doCombine(letters, result, digits, index + 1); result.pop_back(); } } }
void doCombine(char in[], char out[], int length, int recurLev, int start){ int i; for(i=start; i<length; i++){ // Select current letter out[recurLev] = in[i]; // Tack on NUL for printf out[recurLev+1] = '\0'; printf("%s\n", out); // Recurse if more letters in input // if(i < length-1){ doCombine(in, out, length, recurLev+1, i+1); // } } }
int combine(char in[]){ int length; char* out; length = strlen(in); // Allocate output buffer out = (char*)malloc(length + 1); if(!out){ return 0; // Failed } // Enter recursive portion doCombine(in, out, length, 0, 0); free(out); return 1; // Success }