17. 电话号码的字母组合
问题
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
输入:digits = ""
输出:[]
输入:digits = "2"
输出:["a","b","c"]
分析
获取除1之外的选择空间,也就是有效选择空间,然后对每个数字对应的字符们,由于选并且只选一个,显然是dfs,每个子问题是当前的数字选哪一个字符,使用for循环控制,然后记录到结果,处理下一个数字对应的字符们。
代码
class Solution {
public:
int d_n;
vector<string> v_s;
vector<string> res;
void dfs(int x, string temp) {
if (x >= d_n) {
if (temp != "") {
res.push_back(temp);
}
return ;
}
for (int i = 0; i < v_s[x].size(); i++) {
dfs(x+1, temp+v_s[x][i]);
}
};
vector<string> letterCombinations(string digits) {
unordered_map<int, string> um;
um.insert(make_pair(2, "abc"));
um.insert(make_pair(3, "def"));
um.insert(make_pair(4, "ghi"));
um.insert(make_pair(5, "jkl"));
um.insert(make_pair(6, "mno"));
um.insert(make_pair(7, "pqrs"));
um.insert(make_pair(8, "tuv"));
um.insert(make_pair(9, "wxyz"));
for (int i = 0; i < digits.size(); i++) {
if (digits[i] != '1') {
d_n++;
v_s.push_back(um[digits[i]-'0']);
}
}
dfs(0, "");
return res;
}
};

浙公网安备 33010602011771号