题目: 17. 电话号码的字母组合
难度中等
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
解题思路
使用递归的方式进行全排列。
- 首先将数字对应的字符串用哈希表的方式存储起来,方便取用。
- 对每个位置进行全排列。
- 只要到digits的尾部,说明字符串已经生成,放入ans中即可。
代码
class Solution {
private:
map<char, string> phone;
public:
vector<string> letterCombinations(string digits) {
vector<string> ans;
if (!digits.size()) return ans;
initMap();
string outString;
// 预分配内存给string
outString.assign(digits.size() + 1, '\0');
letterCore(ans, digits, 0, outString);
return ans;
}
// 递归的方式进行全排列
void letterCore(vector<string> &ans, string &digits, int index, string &outString) {
if (digits.size() <= index) {
ans.push_back(outString);
return;
}
// 取出电话按键对应的字母串
string tmp = phone[digits.at(index)];
// 进行全排列
for (int i = 0; i < tmp.size(); i++)
{
outString[index] = tmp[i];
letterCore(ans, digits, index + 1, outString);
}
}
void initMap() {
phone['2'] = "abc";
phone['3'] = "def";
phone['4'] = "ghi";
phone['5'] = "jkl";
phone['6'] = "mno";
phone['7'] = "pqrs";
phone['8'] = "tuv";
phone['9'] = "wxyz";
}
};
int main()
{
Solution sln;
string test = "23";
printf("%d\n", test.at(0));
sln.letterCombinations(test);
return 0;
}