题目传送门:
题解:
代码,我起初是参考的github上的一个实现,一开始,对于递归过程不是特别理解,想着,应该是一种树形结构,就在原来代码的基础上适当的地方加上一些打印输出,理解了过程,我的代码如下:
1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #include<cassert> 5 6 using namespace std; 7 8 class Solution { 9 10 private: 11 const string letterMap[10] = { 12 " ", 13 "", 14 "abc", 15 "def", 16 "ghi", 17 "jkl", 18 "mno", 19 "pqrs", 20 "tuv", 21 "wxyz" 22 }; 23 vector<string> res; 24 //s是每次处理一个字符的时候,之前已经转换成的字符串保存在s中 25 //s中保存了此时从digits[0...index-1]翻译得到的一个字母字符串 26 //那在这一次翻译中,只需寻找和digits[index]匹配的字母,找到后,加上s,获得digits[0...index]翻译得到的解 27 // 在conbination()中找到 28 //每次调用findCombination()都只处理digits中的一位,这一位在digits 中的位置是index 29 30 void findCombination(const string& digits,int index,const string& s){ 31 cout<<index<<" : "<<s<<endl; 32 if(index == digits.size()){ 33 res.push_back(s); 34 return; 35 } 36 37 char c = digits[index]; 38 assert(c>='0' && c<='9' && c!='1'); 39 string letters = letterMap[c - '0']; 40 // for(int i = 0;i<letters.size();i++) 41 // findCombination(digits,index+1,s+letters[i]); 42 for(int i = 0;i<letters.size();i++){ 43 cout<<"digits["<<index<<"] = "<<c<<" , use "<<letters[i]<<endl; 44 findCombination(digits,index+1,s + letters[i]); 45 } 46 47 cout<<"digits["<<index<<"] = "<<c<<" complete, return"<<endl; 48 return; 49 } 50 51 public: 52 vector<string> letterCombinations(string digits) { 53 res.clear(); 54 if(digits =="") 55 return res; 56 findCombination(digits,0,""); 57 return res; 58 } 59 60 }; 61 62 int main(){ 63 vector<string> res = Solution().letterCombinations("234"); 64 for(int i = 0;i<res.size();i++) 65 cout<<res[i]<<endl; 66 return 0; 67 }
打印输出结果如下:
1 0 : 2 digits[0] = 2 , use a 3 1 : a 4 digits[1] = 3 , use d 5 2 : ad 6 digits[2] = 4 , use g 7 3 : adg 8 digits[2] = 4 , use h 9 3 : adh 10 digits[2] = 4 , use i 11 3 : adi 12 digits[2] = 4 complete, return 13 digits[1] = 3 , use e 14 2 : ae 15 digits[2] = 4 , use g 16 3 : aeg 17 digits[2] = 4 , use h 18 3 : aeh 19 digits[2] = 4 , use i 20 3 : aei 21 digits[2] = 4 complete, return 22 digits[1] = 3 , use f 23 2 : af 24 digits[2] = 4 , use g 25 3 : afg 26 digits[2] = 4 , use h 27 3 : afh 28 digits[2] = 4 , use i 29 3 : afi 30 digits[2] = 4 complete, return 31 digits[1] = 3 complete, return 32 digits[0] = 2 , use b 33 1 : b 34 digits[1] = 3 , use d 35 2 : bd 36 digits[2] = 4 , use g 37 3 : bdg 38 digits[2] = 4 , use h 39 3 : bdh 40 digits[2] = 4 , use i 41 3 : bdi 42 digits[2] = 4 complete, return 43 digits[1] = 3 , use e 44 2 : be 45 digits[2] = 4 , use g 46 3 : beg 47 digits[2] = 4 , use h 48 3 : beh 49 digits[2] = 4 , use i 50 3 : bei 51 digits[2] = 4 complete, return 52 digits[1] = 3 , use f 53 2 : bf 54 digits[2] = 4 , use g 55 3 : bfg 56 digits[2] = 4 , use h 57 3 : bfh 58 digits[2] = 4 , use i 59 3 : bfi 60 digits[2] = 4 complete, return 61 digits[1] = 3 complete, return 62 digits[0] = 2 , use c 63 1 : c 64 digits[1] = 3 , use d 65 2 : cd 66 digits[2] = 4 , use g 67 3 : cdg 68 digits[2] = 4 , use h 69 3 : cdh 70 digits[2] = 4 , use i 71 3 : cdi 72 digits[2] = 4 complete, return 73 digits[1] = 3 , use e 74 2 : ce 75 digits[2] = 4 , use g 76 3 : ceg 77 digits[2] = 4 , use h 78 3 : ceh 79 digits[2] = 4 , use i 80 3 : cei 81 digits[2] = 4 complete, return 82 digits[1] = 3 , use f 83 2 : cf 84 digits[2] = 4 , use g 85 3 : cfg 86 digits[2] = 4 , use h 87 3 : cfh 88 digits[2] = 4 , use i 89 3 : cfi 90 digits[2] = 4 complete, return 91 digits[1] = 3 complete, return 92 digits[0] = 2 complete, return 93 adg 94 adh 95 adi 96 aeg 97 aeh 98 aei 99 afg 100 afh 101 afi 102 bdg 103 bdh 104 bdi 105 beg 106 beh 107 bei 108 bfg 109 bfh 110 bfi 111 cdg 112 cdh 113 cdi 114 ceg 115 ceh 116 cei 117 cfg 118 cfh 119 cfi 120 请按任意键继续. . .