leetcode17电话号码字母组合

题目描述:
 
电话号码的字母组合难度中等952给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
 
示例:
输入:"23"
输出:["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);
		}
	}

  

posted on 2020-10-09 17:45  lkjhgfdsa123  阅读(174)  评论(0编辑  收藏  举报