Given a digit string, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below.
Input:Digit string "23" Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
题意:给定数字串,输出对应字母的组合
思路:基本的DFS,这题和平常一般的DFS的区别,在于一般情况下,我们只需直接用下标进行深搜,而本题中,得先从数字串中取出一个数字,获得相应字符串以后,再在对应的字符串中获得一个字符,再在下一个数字对应的字符串中获得另一个字符,以这样的形式进行深搜整个过程类似于搜索二维数组,取数子相当于遍历行,取字母相当于遍历列。代码如下:
1 class Solution { 2 public: 3 vector<string> letterCombinations(string digits) 4 { 5 vector<string> res; 6 if(digits.empty()) return {""}; //当digits为空的时候,应该返回"" 7 string dict[]={" "," ","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; 8 string midstr; 9 letterDFS(digits,res,dict,midstr,0); 10 return res; 11 } 12 13 void letterDFS(const string &digits,vector<string> &res,string dict[],string midstr, int start) 14 { 15 if(start==digits.size()) 16 res.push_back(midstr); 17 else 18 { 19 string str=dict[digits[start]-'0']; 20 for(int i=start;i<str.size();++i) 21 { 22 midstr.push_back(str[i]); 23 letterDFS(digits,res,dict,midstr,start+1); 24 midstr.pop_back(); 25 } 26 } 27 28 29 } 30 };
方法二:这种方法的思路和subset的迭代解法很像。这里因为有一个取数字串中数字的情况存在,所以,多一个for循环,其余的基本一样。如:“23” ,res中先存入“a”,"b","c",然后和“3”对应的字符相结合,后来存入"ad","ae","af", "bd","be","bf", "cd","ce","cf"参考了Cindy_niu的博客
1 class Solution { 2 public: 3 vector<string> letterCombinations(string digits) 4 { 5 vector<string> res(1,""); 6 string dict[]={" "," ","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; 7 8 for(int i=0;i<digits.size();++i) 9 { 10 vector<string> temp; 11 for(int j=0;j<res.size();++j) 12 { 13 for(int k=0;k<dict[digits[i]-'0'].size();++k) 14 { 15 temp.push_back(res[j]+dict[digits[i]-'0'][k]); 16 } 17 } 18 res=temp; 19 } 20 return res; 21 } 22 };