专题

33 阅读1分钟

回溯+剪枝

思路:

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);        }    }}