17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
标准答案
class Solution {
public:
//1. 用map记录每个数字按键对应的所有字母
unordered_map<char, string> M = {
{'2', "abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"},
{'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}
};
//2. 存储最终结果和临时结果的变量
vector<string> ans;
string current;
//3. DFS函数,index是生成临时结果字串的下标,
//每一个digits[index]数字对应临时结果current[index]的一位字母
void DFS(int index, string digits) {
//出口
if(index == digits.size()) {
ans.push_back(current);
return;
}
//递归调用
//对于当前输入的第index号数字(digits[index]),
//枚举其对应的所有字母(M[digits[index]][i])
for(int i = 0; i < M[digits[index]].size(); i++) {
current.push_back(M[digits[index]][i]); //临时结果压入一个字母
DFS(index + 1, digits); //以在当前位置压入该字母这一“情况”为前提,构造此“分支”的后续结果
current.pop_back(); //状态还原,例如临时结果从 "ab" -> "a",下一次循环尝试"ac"
}
}
vector<string> letterCombinations(string digits) {
if(digits.size() == 0) {
return ans;
}
DFS(0, digits);
return ans;
}
};
我的答案
class Solution {
private:
void change_res(const char c) {
tmp.clear();
if (c == '2') {
if (res.empty()) {
tmp.emplace_back("a");
tmp.emplace_back("b");
tmp.emplace_back("c");
}
for (const auto& ss : res) {
tmp.emplace_back(ss + "a");
tmp.emplace_back(ss + "b");
tmp.emplace_back(ss + "c");
}
}
else if (c == '3') {
if (res.empty()) {
tmp.emplace_back("d");
tmp.emplace_back("e");
tmp.emplace_back("f");
}
for (const auto& ss : res) {
tmp.emplace_back(ss + "d");
tmp.emplace_back(ss + "e");
tmp.emplace_back(ss + "f");
}
}
else if (c == '4') {
if (res.empty()) {
tmp.emplace_back("g");
tmp.emplace_back("h");
tmp.emplace_back("i");
}
for (const auto& ss : res) {
tmp.emplace_back(ss + "g");
tmp.emplace_back(ss + "h");
tmp.emplace_back(ss + "i");
}
}
else if (c == '5') {
if (res.empty()) {
tmp.emplace_back("j");
tmp.emplace_back("k");
tmp.emplace_back("l");
}
for (const auto& ss : res) {
tmp.emplace_back(ss + "j");
tmp.emplace_back(ss + "k");
tmp.emplace_back(ss + "l");
}
}
else if (c == '6') {
if (res.empty()) {
tmp.emplace_back("m");
tmp.emplace_back("n");
tmp.emplace_back("o");
}
for (const auto& ss : res) {
tmp.emplace_back(ss + "m");
tmp.emplace_back(ss + "n");
tmp.emplace_back(ss + "o");
}
}
else if (c == '7') {
if (res.empty()) {
tmp.emplace_back("p");
tmp.emplace_back("q");
tmp.emplace_back("r");
tmp.emplace_back("s");
}
for (const auto& ss : res) {
tmp.emplace_back(ss + "p");
tmp.emplace_back(ss + "q");
tmp.emplace_back(ss + "r");
tmp.emplace_back(ss + "s");
}
}
else if (c == '8') {
if (res.empty()) {
tmp.emplace_back("t");
tmp.emplace_back("u");
tmp.emplace_back("v");
}
for (const auto& ss : res) {
tmp.emplace_back(ss + "t");
tmp.emplace_back(ss + "u");
tmp.emplace_back(ss + "v");
}
}
else if (c == '9') {
if (res.empty()) {
tmp.emplace_back("w");
tmp.emplace_back("x");
tmp.emplace_back("y");
tmp.emplace_back("z");
}
for (const auto& ss : res) {
tmp.emplace_back(ss + "w");
tmp.emplace_back(ss + "x");
tmp.emplace_back(ss + "y");
tmp.emplace_back(ss + "z");
}
}
else {
return;
}
res.clear();
res = tmp;
}
void traversal(string digits, int index) {
if (index == digits.size()) {
return;
}
const auto integer = digits[index];
change_res(integer);
traversal(digits, index + 1);
}
public:
vector<string> res;
vector<string> tmp;
vector<string> letterCombinations(string digits) {
traversal(digits, 0);
return res;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理