回溯法

回溯法是一种搜索算法。

  • 题目讲解
    这道题来自leetcode,题目名称是“电话号码的字母组合”
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

电话键盘

  • 题目分析

这是一道排列问题。题目要求我们输出所有的排列,是一道可以使用回溯法求解的问题。使用回溯法首先确定解空间树。以“23”为例,解空间树如下所示。

开始
a
b
c
d
e
f
d
e
f
d
e
f
结束

遍历每一层的可能情况使用一个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)。解空间树的每一层就是一步,每一步对应着多个状态,就表示多个树分支,而递归可以理解为进入下一步,退出条件就是对步骤进行判定,如果到达最后一步就回退。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值