一、题目
给定一个仅包含数字 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'] 的一个数字。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
二、题解
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> keys;
for (auto c : digits)
{
auto it = table.find(c);
if (it != table.end())
keys.push_back(it->second);
}
vector<string> ret;
string out;
backstrackcombine(ret, keys.begin(), keys.end(), out);
return ret;
}
private:
void backstrackcombine(vector<string>& ret, vector<string>::iterator beg, vector<string>::iterator end, string& out)
{
if (beg == end)
{
return ;
}
for (auto ch : *beg)
{
out.push_back(ch);
auto cur = beg;
backstrackcombine(ret, ++cur, end, out);
if (cur == end)
{
ret.push_back(out);
}
out.pop_back();
}
}
private:
const map<char, const char*> table{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
};