LeetCode热题100--17. 电话号码的字母组合
题目
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “2”
输出:[“a”,“b”,“c”]
题解
class Solution {Map<Character, String> phoneMap = new HashMap<>() {{put('2', "abc");put('3', "def");put('4', "ghi");put('5', "jkl");put('6', "mno");put('7', "pqrs");put('8', "tuv");put('9', "wxyz");}};List<String> res = new ArrayList<String>();StringBuffer buffer = new StringBuffer();public List<String> letterCombinations(String digits) {//解决快速寻找数组中所有存在目标字母的方法: Map加回溯if (digits.length() == 0) return res;backtrack( digits, 0);return res;}public void backtrack(String digits, int index) {if (index == digits.length()) res.add(buffer.toString());else {char digit = digits.charAt(index);String letters = phoneMap.get(digit);for (int i = 0; i < letters.length(); i++) {buffer.append(letters.charAt(i));backtrack( digits, index+1);buffer.deleteCharAt(index);}}}
}
解析
出自:电话号码的字母组合
class Solution {Map<Character, String> phoneMap = new HashMap<>() {{ // 初始化电话号码到字母的对应关系put('2', "abc");put('3', "def");put('4', "ghi");put('5', "jkl");put('6', "mno");put('7', "pqrs");put('8', "tuv");put('9', "wxyz");}};List<String> res = new ArrayList<String>(); // 初始化结果列表,用于存储所有的组合结果StringBuffer buffer = new StringBuffer(); // 初始化字符串缓冲区,用于保存每个数字对应的字母组合public List<String> letterCombinations(String digits) { // main方法,处理输入为空的情况并调用回溯函数if (digits.length() == 0) return res;backtrack(digits, 0);return res;}public void backtrack(String digits, int index) { // 处理每一个数字对应的字母组合的回溯函数if (index == digits.length()) res.add(buffer.toString());else {char digit = digits.charAt(index); // 获取当前索引位置上的输入位数字(如'2', '3', ..., '9'等)String letters = phoneMap.get(digit); // 获得对应的字母组合,例如"abc","def"等for (int i = 0; i < letters.length(); i++) { buffer.append(letters.charAt(i)); // 将每一种可能的结果添加到缓冲区中backtrack(digits, index + 1); // 进行回溯函数调用,处理下一个数字的字母组合buffer.deleteCharAt(index); // 删除刚刚添加的字符(这个过程需要重复进行,因为我们是按递归逐个字母遍历)}}}
}