一、题目
给定一个仅包含数字 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']
的一个数字。
二、代码
class Solution {
// 数字和字母的对应和关系表,一维下标是数字,二维是数字对应的字母表
public static char[][] phone = {
{ 'a', 'b', 'c' }, // 2 0
{ 'd', 'e', 'f' }, // 3 1
{ 'g', 'h', 'i' }, // 4 2
{ 'j', 'k', 'l' }, // 5 3
{ 'm', 'n', 'o' }, // 6
{ 'p', 'q', 'r', 's' }, // 7
{ 't', 'u', 'v' }, // 8
{ 'w', 'x', 'y', 'z' }, // 9
};
public List<String> letterCombinations(String digits) {
List<String> ans = new ArrayList<>();
if (digits == null || digits.length() == 0) {
return ans;
}
char[] dig = digits.toCharArray();
char[] path = new char[dig.length];
dfs(dig, 0, path, 0, phone, ans);
return ans;
}
public void dfs(char[] dig, int di, char[] path, int pi, char[][] phone, List<String> ans) {
// 递归出口,已经将所有按键都遍历过了,收集一下沿途的答案
if (di == dig.length) {
// 将path加入到ans中
ans.add(String.valueOf(path));
} else {
// 尝试这个按键所有可能的字符向下递归
for (int i = 0; i < phone[dig[di] - '2'].length; i++) {
// 将字符加入到path中
path[pi] = phone[dig[di] - '2'][i];
dfs(dig, di + 1, path, pi + 1, phone, ans);
}
}
}
}
三、解题思路
去递归尝试所有数字对应的字符可能性,深度优先遍历到底了,收集沿途的答案。
要在之前构建起一个数字和字母的对应关系表。