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


链接
17. 电话号码的字母组合 - 力扣(LeetCode) (leetcode-cn.com)
解法一:回溯 + 数组存储
1 class Solution { 2 3 //设置全局列表存储最后的结果 4 List<String> res = new ArrayList<>(); 5 6 public List<String> letterCombinations(String digits) { 7 if (digits == null || digits.length() == 0) { 8 return res; 9 } 10 11 //初始对应所有的数字,为了直接对应2-9,新增了两个无效的字符串"" 12 String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; 13 14 //迭代处理 15 backtracking(digits, numString, 0); 16 return res; 17 } 18 19 //每次迭代获取一个字符串,所以会设计大量的字符串拼接,所以这里选择更为高效的 StringBuild 20 StringBuilder temp = new StringBuilder(); 21 22 //比如digits如果为"23",num(长度) 为0,则str表示2对应的 abc 23 private void backtracking(String digits, String[] numString, int num) { 24 //遍历全部一次记录一次得到的字符串 25 if (num == digits.length()) { 26 res.add(temp.toString()); 27 return; 28 } 29 //str 表示当前num对应的字符串 30 String str = numString[digits.charAt(num) - '0']; 31 for (int i = 0; i < str.length(); i++) { 32 temp.append(str.charAt(i)); 33 backtracking(digits, numString, num + 1); 34 //剔除末尾的继续尝试 35 temp.deleteCharAt(temp.length() - 1); 36 } 37 } 38 }
解法二:回溯 + 哈希表
1 class Solution { 2 public List<String> letterCombinations(String digits) { 3 List<String> res = new ArrayList<String>(); 4 if(digits.length() == 0) { 5 return res; 6 } 7 //Map<Character, String> phoneMap = new HashMap<Character, String>(); 8 HashMap<Character, String> phoneMap = new HashMap<Character,String>() {{ 9 put('2',"abc"); 10 put('3',"def"); 11 put('4',"ghi"); 12 put('5',"jkl"); 13 put('6',"mno"); 14 put('7',"pqrs"); 15 put('8',"tuv"); 16 put('9',"wxyz"); 17 }}; 18 backtrack(res, phoneMap, digits, 0, new StringBuffer()); 19 return res; 20 } 21 public void backtrack(List<String> res, Map<Character, String> phoneMap, String digits, int index, StringBuffer temp) { 22 if(index == digits.length()) { 23 res.add(temp.toString()); 24 } 25 else { 26 char digit = digits.charAt(index); 27 String letters = phoneMap.get(digit); 28 int lettersCount = letters.length(); 29 for (int i = 0; i < lettersCount; i++) { 30 temp.append(letters.charAt(i)); 31 backtrack(res, phoneMap, digits, index + 1, temp); 32 temp.deleteCharAt(index); 33 } 34 } 35 } 36 }
参考
carl

浙公网安备 33010602011771号