回溯+剪枝
思路:
0、画出状态树
1、参数设计:结果值是什么,中间状态用哪些参数来准确描述
2、终止条件设计
3、回溯:进行回溯,中间状态值的更新记得注意
4、恢复:恢复相关参数值
5、剪枝:跳过无效选择
号码组合:
按照上述的流程去做这题
1、状态树:拿到数字组合 按照顺序将其映射的结果进行拼接(自己手动去画)
2、参数设计:map:数字与string的映射map,char[]dig:当前数字输入数组,depth,当前处于第几层,StringBuilder cur,当前字符串,List res,结果集
3、终止条件cur.length() == dig.length
4、回溯:先遍历dig,i=depth,表示当前处于第几层,拿到当前层数的string字符串,然后再讲每个char元素append给cur(需要new一个sb,不然cur会被回溯过程修改),然后触发回溯, 其中depth为当前 i + 1
public static List<String> letterCombinations(String digits) { HashMap<Character, String> dictory = new HashMap<>(); dictory.put('2', "abc"); dictory.put('3', "def"); dictory.put('4', "ghi"); dictory.put('5', "jkl"); dictory.put('6', "mno"); dictory.put('7', "pqrs"); dictory.put('8', "tuv"); dictory.put('9', "wxyz"); char[] digit = digits.toCharArray(); List<String> res = new ArrayList<>(); backLetterCombinations(dictory, digit, new StringBuilder(), res, 0); return res;}public static void backLetterCombinations(HashMap<Character, String> dictory, char[] digit, StringBuilder cur, List<String> res, int depth){ if (cur.length() == digit.length) { res.add(new String(cur)); return; } for (int i = depth; i < digit.length; i++) { String value = dictory.get(digit[i]); char[] temp = value.toCharArray(); for (int j = 0; j < temp.length; j++) { StringBuilder sb = new StringBuilder(cur); sb.append(temp[j]); backLetterCombinations(dictory, digit, sb, res, i + 1); } }}