题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:

输入 :digits = "23"
输出 :["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入 :digits = "2"
输出 :["a","b","c"]
提示:
1 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
思路
1 使用哈希表存储每个数字代表的字符串。
2 digits的每个数字作为一层dfs,每次挑出字符串中的一个字符出来组成答案。
3 详细见代码。
代码
cpp
class Solution {
public:
// 利用哈希表存储每个数字的字符串
unordered_map<char, string>mp{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"},
};
vector<string> letterCombinations(string digits) {
vector<string>ans;
string res;
int po = 0; // 遍历第po个位置的字符串
string s = mp[digits[po]];
int m = s.size();
for(int i = 0; i < m; ++i)
{
res.push_back(s[i]);
dfs(digits, res, ans);
res.pop_back();
}
return ans;
}
void dfs(string &digits, string &res, vector<string> &ans)
{
if(res.size() == digits.size())
{
ans.push_back(res);
return;
}
int po = res.size(); // 遍历第po个位置的字符串
string s = mp[digits[po]];
int m = s.size();
for(int i = 0; i < m; ++i)
{
res.push_back(s[i]);
dfs(digits, res, ans);
res.pop_back();
}
}
};