LeetCode-17-电话号码的字母组合

题目

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

img

示例 1:

1
2
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

1
2
输入:digits = ""
输出:[]

示例 3:

1
2
输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

题解

这一题要用到回溯的方法来解决:

根据题目要求自然需要一个数字到字母的映射,这里用String[]即可,下标表示对应的数字;

如果digits长度为0,返回空列表;

为了便于处理把digits变为char[],然后进行DFS

DFS的功能为:对于当前数字对应的各个字母,将临时的结果保存到path中,然后继续进行遍历,直到遍历到的idigits的长度将path添加到ans里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
// 每个数字对应的映射
private static final String[] MAPPING = new String[] {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

// 结果list
private final List<String> ans = new ArrayList<>();
// digits是字符数组的digits,path暂时保存每次的结果
private char[] digits, path;

public List<String> letterCombinations(String digits) {
int n = digits.length();
if (n == 0)
return new ArrayList<String>();
this.digits = digits.toCharArray();
path = new char[n]; // 本题 path 长度固定为 n,path长度和给的digits的长度保持一致
dfs(0);
return ans;
}

private void dfs(int i) {
// 当前遍历到要求的长度后添加到ans中
if (i == digits.length) {
ans.add(new String(path));
return;
}
// 获取相应数字对应的每个字母
for (char c : MAPPING[digits[i] - '0'].toCharArray()) {
path[i] = c; // 直接覆盖
dfs(i + 1); // 继续往后遍历
}
}
}

LeetCode-17-电话号码的字母组合
https://excelius.xyz/leetcode-17-电话号码的字母组合/
作者
Ther
发布于
2024年8月7日
许可协议