题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
输入:digits = "" 输出:[]
解决方法
创建一个哈希表,存储每个数字对应的字母。
对给定的字符串进行回溯。创建一个字符串数组用以存储结果,建立一个字符串表示已经找到的排列,初始为空。对给定的电话号码进行遍历,每次遍历到一位数字,哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到结果字符串后面。然后,继续遍历字符串的后一位数字。当得到了一个完整的结果序列时,进行回退操作,遍历其余的字母排列。
代码实现
class Solution {
public:
map<char,string> phoneMap{
{'2',"abc"},
{'3',"def"},
{'4',"ghi"},
{'5',"jkl"},
{'6',"mno"},
{'7',"pqrs"},
{'8',"tuv"},
{'9',"wxyz"}
};
void dfs(string s,string temp,vector<string>& res,int item){
if(s.size() == temp.size()){
res.push_back(temp);
return;
}
char digit = s[item];
const string& letters = phoneMap.at(digit);
for(int i = 0;i < letters.size();i ++){
temp.push_back(letters[i]);
dfs(s,temp,res,item+1);
temp.pop_back();
}
}
vector<string> letterCombinations(string digits) {
vector<string> res;
if(digits.size() == 0) return res;
string temp;
dfs(digits,temp,res,0);
return res;
}
};