LeetCode回溯-01

it2023-10-09  67

九键键盘一串数字组成的字母字符串集合

回溯

二叉树画图表示

题目

输入:“23” 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”] 注意 1 不对应任何字母

画图解析

代码(非标准输入输出)

class Solution { public List<String> letterCombinations(String digits) { List<String> list = new ArrayList<String>(); if (digits.length() == 0) { //第一判断条件 return list; } Map<Character, String> phoneMap = new HashMap<Character, String>() {{ //多个数据存入 put('2', "abc"); put('3', "def"); put('4', "ghi"); put('5', "jkl"); put('6', "mno"); put('7', "pqrs"); put('8', "tuv"); put('9', "wxyz"); }}; backtrack(list, phoneMap, digits, 0, new StringBuffer()); //回溯 return list; } public void backtrack(List<String> list, Map<Character, String> phoneMap, String digits, int index, StringBuffer str) { if (index == digits.length()) { //遍历结束 list.add(str.toString()); } else { char digit = digits.charAt(index); String letters = phoneMap.get(digit); int lettersCount = letters.length(); for (int i = 0; i < lettersCount; i++) { //这里循环的是第一个数字对应的各个字母 str.append(letters.charAt(i));//选中第一个数字对应的第i个字母 backtrack(list, phoneMap, digits, index + 1, str); //走到下一个数字(这里是对数字的遍历 str.deleteCharAt(index); //回退恢复进行下一种情况 } } } }

为何使用StringBuffer

线程安全且可变,String不可变

回溯其实也是dfs 回溯有一个重要步骤是剪枝,这里不必剪枝

最新回复(0)