Leetcode 17. 电话号码的字母组合
题目描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
是一道求全部组合的题,用DFS来做。代码使用unordered_multimap+DFS,时间运行效率和内存消耗都不错。
代码:
class Solution {
private:
unordered_multimap<char, string> phoneKeys;
public:
vector<string> letterCombinations(string digits) {
vector<string> result;
if (0 == digits.size()) {
return result;
}
//建立数字和字母的映射关系
phoneKeys.insert({{'2', "a"}, {'2', "b"}, {'2', "c"}});
phoneKeys.insert({{'3', "d"}, {'3', "e"}, {'3', "f"}});
phoneKeys.insert({{'4', "g"}, {'4', "h"}, {'4', "i"}});
phoneKeys.insert({{'5', "j"}, {'5', "k"}, {'5', "l"}});
phoneKeys.insert({{'6', "m"}, {'6', "n"}, {'6', "o"}});
phoneKeys.insert({{'7', "p"}, {'7', "q"}, {'7', "r"}, {'7', "s"}});
phoneKeys.insert({{'8', "t"}, {'8', "u"}, {'8', "v"}});
phoneKeys.insert({{'9', "w"}, {'9', "x"}, {'9', "y"}, {'9', "z"}});
//4. 递归的调用
Combinations(digits, 0, "", result);
return result;
}
//每次从start开始寻找digits中剩余元素的全部组合数
//1. 递归的定义
void Combinations(string digits, int start, string tmp_res, vector<string>& result) {
//2. 递归的出口
if (digits.size() == tmp_res.size()) {
result.push_back(tmp_res);
return;
}
//3.递归的拆解
for (int i = start; i < digits.size(); ++i) {
auto range_i = phoneKeys.equal_range(digits[i]);
for (auto iter = range_i.first; iter != range_i.second; ++iter) {
tmp_res += iter->second;
Combinations(digits, i + 1, tmp_res, result);//每次递归都是一次尝试,所以记得递归语句要上下对称
tmp_res.erase(tmp_res.size() - 1, 1);
}
}
}
};