题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
题解
方式一:dfs + 队列
public List<String> letterCombinations(String digits) {
List<String> result = new ArrayList<>();
if (digits == null || digits.isEmpty()) {
return result;
}
// 映射关系
Map<Character, String[]> map = new HashMap<>();
map.put('2', new String[]{"a", "b", "c"});
map.put('3', new String[]{"d", "e", "f"});
map.put('4', new String[]{"g", "h", "i"});
map.put('5', new String[]{"j", "k", "l"});
map.put('6', new String[]{"m", "n", "o"});
map.put('7', new String[]{"p", "q", "r", "s"});
map.put('8', new String[]{"t", "u", "v"});
map.put('9', new String[]{"w", "x", "y", "z"});
String[][] input = new String[digits.length()][];
char[] chars = digits.toCharArray();
for (int i = 0; i < chars.length; i++) {
input[i] = map.get(chars[i]);
}
dfs(input, result, new StringBuilder(), 0);
return result;
}
public void dfs(String[][] input, List<String> result, StringBuilder deque, int level) {
if (deque.length() == input.length) {
result.add(deque.toString());
return;
}
for (int i = 0; i < input[level].length; i++) {
deque.append(input[level][i]);
dfs(input, result, deque, level + 1);
deque.deleteCharAt(deque.length() - 1); // 回溯
}
}
总结
算法:dfs、回溯
数据结构:队列