题目描述
解题思路
代码示例
class Solution
{
public:
vector<string> letterCombinations(string digits)
{
vector<string> combinations;//用来存放组合结果的解集
if (digits.empty()) //如果输入为空,直接返回
{
return combinations;
}
unordered_map<char, string> phoneMap//建立哈希表
{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
string combination;//存放部分解
backtrack(combinations, phoneMap, digits, 0, combination);//递归求解
return combinations;
}
void backtrack(vector<string>& combinations, const unordered_map<char, string>& phoneMap,
const string& digits, int index, string& combination)
//将部分解按地址传入,避免重复拷贝
{
if (index == digits.length()) //递归出口
{
combinations.push_back(combination);//组合好的解插入结果解集中
}
else
{
char digit = digits[index];
const string& letters = phoneMap.at(digit);
//at 查找key所对应的值,如果存在:返回key对应的值,可以直接修改,和[]操作一样。如果不存在:抛出 out_of_range 异常.
for (const char& letter: letters)
{
combination.push_back(letter);//插入字符
backtrack(combinations, phoneMap, digits, index + 1, combination);//递归
combination.pop_back();//将组合完的解从部分解中去除
}
}
}
};
力扣