leetcode17电话号码字母组合
题目描述:
电话号码的字母组合难度中等952给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
思路:使用回溯
回溯的使用场景:
1 遍历所有的可能组合
输出所有可能
查找某个符合条件的组合
回溯的标准解法:dfs+回溯,为什么要使用dfs,不用bfs,因为dfs使用递归,可以使用系统栈保存现场
如果是String的话不用考虑回溯,因为会重新new一个对象,如果是List,StringBuffer等引用类型的对象,需要回溯
我的解法
public List<String> letterCombinations(String digits) { Map<Character, List<Character>> map = new HashMap<Character, List<Character>>(); map.put('2', Arrays.asList('a', 'b', 'c')); map.put('3', Arrays.asList('d', 'e', 'f')); map.put('4', Arrays.asList('g', 'h', 'i')); map.put('5', Arrays.asList('j', 'k', 'l')); map.put('6', Arrays.asList('m', 'n', 'o')); map.put('7', Arrays.asList('p', 'q', 'r', 's')); map.put('8', Arrays.asList('t', 'u', 'v')); map.put('9', Arrays.asList('w', 'x', 'y', 'z')); int len = digits.length(); List<String> list = new ArrayList<String>(); if (len == 0) { return list; } dfs("", list, len, 0, map, digits); return list; } private void dfs(String curStr, List<String> list, int len, int depth, Map<Character, List<Character>> map, String digits) { if (len == depth) { list.add(curStr); return; } List<Character> list2 = map.get(digits.charAt(depth)); for (int i = 0; i < list2.size(); i++) { dfs(curStr + list2.get(i), list, len, depth + 1, map, digits); } }
参考答案
public List<String> letterCombinations(String digits) { Map<Character, List<Character>> map = new HashMap<Character, List<Character>>(); map.put('2', Arrays.asList('a', 'b', 'c')); map.put('3', Arrays.asList('d', 'e', 'f')); map.put('4', Arrays.asList('g', 'h', 'i')); map.put('5', Arrays.asList('j', 'k', 'l')); map.put('6', Arrays.asList('m', 'n', 'o')); map.put('7', Arrays.asList('p', 'q', 'r', 's')); map.put('8', Arrays.asList('t', 'u', 'v')); map.put('9', Arrays.asList('w', 'x', 'y', 'z')); int len = digits.length(); List<String> list = new ArrayList<String>(); if (len == 0) { return list; } dfs("", list, len, 0, map, digits); return list; } private void dfs(String curStr, List<String> list, int len, int depth, Map<Character, List<Character>> map, String digits) { if (len == depth) { list.add(curStr); return; } List<Character> list2 = map.get(digits.charAt(depth)); for (int i = 0; i < list2.size(); i++) { dfs(curStr + list2.get(i), list, len, depth + 1, map, digits); } }