LeetCode 热题 HOT 100 Java题解
17. 电话号码的字母组合
题目:
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
回溯
每个数字对应了3个或者4个字母,非常适合回溯的模板,在全局维护一个 r e s res res结果列表和一个 p a t h path path中间结果路径,每递归到底一次就将 p a t h path path中的字符串存到 r e s res res中,然后回溯,移除上一层的操作。
import java.util.ArrayList;
import java.util.List;
class Solution {
int[][] list = {
{}, //0
{}, //1
{0, 2}, //2
{3, 5}, //3
{6, 8}, //4
{9, 11}, //5
{12, 14}, //6
{15, 18}, //7
{19, 21}, //8
{22, 25} //9
};
List<String> res = new ArrayList<>();
StringBuilder path = new StringBuilder();
public void backtrack(char[] str, int index) {
if(index == str.length) {
res.add(path.toString());
return;
}
int num = str[index] - '0';
for(int i = list[num][0]; i <= list[num][1]; i++) {
path.append((char)('a' + i));
backtrack(str, index + 1);
path.deleteCharAt(path.length() - 1);
}
}
public List<String> letterCombinations(String digits) {
char[] str = digits.toCharArray();
if(str.length == 0) return res;
backtrack(str, 0);
return res;
}
}
复杂度分析
-
时间复杂度: O ( 3 M × 4 N ) O(3^M \times 4^N) O(3M×4N)
M M M 是对应三个字母的数字个数, N N N 是对应四个字母的数字个数。
-
空间复杂度: O ( 3 M × 4 N ) O(3^M \times 4^N) O(3M×4N)
一共要生成 3 M × 4 N 3^M \times 4^N 3M×4N 个结果。