给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序
法一:递归
class Solution {
public:
void get(vector<string> letter, int loc, string &s, vector<string> &res) {
for (char &c : letter[loc]) {
s[loc] = c;
if (loc == letter.size() - 1) {
res.push_back(s);
}
else {
get(letter, loc + 1, s, res);
}
}
}
vector<string> letterCombinations(string digits) {
vector<string> res, letter;
if(digits.empty())
return res;
for (char &a : digits) {
letter.push_back(get_string(a));
}
string s = digits;
get(letter, 0, s, res);
return res;
}
string get_string(const char &x) {
string s;
switch (x) {
case '2' : s = "abc"; break;
case '3' : s = "def"; break;
case '4' : s = "ghi"; break;
case '5' : s = "jkl"; break;
case '6' : s = "mno"; break;
case '7' : s = "pqrs"; break;
case '8' : s = "tuv"; break;
case '9' : s = "wxyz"; break;
}
return s;
}
};
法二:DFS
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> res;
if(digits.empty())
return res;
vector<string> digit_str = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> letter;
for (auto &c : digits){
letter.push_back(digit_str[c-'2']);
}
queue<string> Q;
Q.push("");
for (string str : letter) {
int n = Q.size();
for(int j = 0; j < n; j++){
string temp = Q.front();
for (char &c : str) {
string temp = Q.front() + c;
if(temp.size() == digits.size())
res.push_back(temp);
else
Q.push(temp);
}
Q.pop();
}
}
return res;
}
};