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"].
题目大意:根据数字得到的所有可能的字符串
方法一(迭代):用模拟的方法,可以联想一下我们用旧手机输入英文是怎么输入的,假设前面有一段已结输入好的串,我们这时要输入 按键2 上的字母则一共可能有 三种情况 分别是"...a","...b","...c",我们只需要在原有的基础上加上一个字符就行了。这时很容易想到用迭代的方法解题,我们把前n-1个字母所有可能的情况,都拿出来在后面加上第n个字母就行了。
代码如下:
class Solution { public: vector<string> letterCombinations(string digits) { vector<string> ans; string str; if(digits.empty()) return ans; vector<string> strs(10); strs[2]="abc"; strs[3]="def"; strs[4]="ghi"; strs[5]="jkl"; strs[6]="mno"; strs[7]="pqrs"; strs[8]="tuv"; strs[9]="wxyz"; ans.push_back("");//初始化0个数字可能的情况 for(int i=0;i<digits.size();i++){ int len=ans.size(); for(int j=0;j<len;j++){ str=ans[0]; ans.erase(ans.begin()); for(int k=0;k<strs[digits[i]-'0'].size();k++){ ans.push_back(str+strs[digits[i]-'0'][k]); } } } return ans; } };
递归代码如下:
class Solution { public: vector<string> letterCombinations(string digits) { vector<string> ans; string str; if(digits.empty()) return ans; map<char,string> letter; letter['0']=""; letter['1']=""; letter['2']="abc"; letter['3']="def"; letter['4']="ghi"; letter['5']="jkl"; letter['6']="mno"; letter['7']="pqrs"; letter['8']="tuv"; letter['9']="wxyz"; DFS(digits,letter,ans,str,0); return ans; } private: void DFS(string digits,map<char,string> letter,vector<string> &ans,string str,int step){ if(step>=digits.size()){ ans.push_back(str); return; }else{ for(int i=0;i<letter[digits[step]].size();i++){ DFS(digits,letter,ans,str+letter[digits[step]][i],step+1); } } } };