回溯法是一种搜索算法。
- 题目讲解
这道题来自leetcode,题目名称是“电话号码的字母组合”
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例: 输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
- 题目分析
这是一道排列问题。题目要求我们输出所有的排列,是一道可以使用回溯法求解的问题。使用回溯法首先确定解空间树。以“23”为例,解空间树如下所示。
遍历每一层的可能情况使用一个for循环就行,找寻下一个数字所对应的状态可以使用递归实现,解题的伪代码如下:
private void aletter(String digits,int index,List<Character> chars){ if(index<0){ 存储结果, 退出; }else{ for(String i :zhuanhuan(digits.charAt(index))){ //展开所有的状态 chars.add(i.charAt(0)); //添加i下标对应的这个状态 aletter(digits,--index,chars); //--index表示的进入下一层 chars.remove(chars.size()-1); //删除i下标对应的这个状态 index++; //index++表示退回上一层 } }
该题目中 chars.remove(chars.size()-1);这一步的意义在于恢复状态,将结果数组chars恢复到没有递归之前的状态。
回溯算法中需要理解步骤(step)和状态(states)。解空间树的每一层就是一步,每一步对应着多个状态,就表示多个树分支,而递归可以理解为进入下一步,退出条件就是对步骤进行判定,如果到达最后一步就回退。