给定一个仅包含数字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
的一个数字
解答
本题的解题步骤如下:
- 将按键数字变成对应的字符串
可以对按键代表的字母进行预处理,例如使用switch语句,或者直接建立一个字符串数组; - 将
digits[i]
变成int
类型的变量
这一步比较简单,使用digits[i] - '0'
即可; - 使用嵌套的循环或递归将每一位的字母填进去
使用深度优先搜索DFS,用一个int变量pos
代表当前填入的字母位置,终止条件为pos==digits.size()
,此时将字符串tmp
填入最终结果数组res
中。搜索行为为依次填入各位的字母,每填入一个字母便递归地填写下一位字母,最后将已填入的字母弹出。
代码
class solution{
public:
string tmp;
vector<string> res;
vector<string> board = {"", "", "abc", "def", "ghi", "jki", "mno", "pqrs", "tuv", "wxyz"};
void DFS(int pos, string digits) {
if (pos == digits.size()) {
res.back_push(tmp);
return;
}
int num = digits[pos] - '0';
for (int i = 0; i < board[num].size(); i++) {
tmp.push_back(board[num][i]);
DFS(pos + 1, digits);
tmp.pop_back();
}
}
vector<string> letterCombination(string digits) {
if (digits == "") return res;
DFS(0, digits);
return res;
}
};
本文题目及部分解答来自力扣:电话号码的字母组合