/**
* 本题使用回溯法解决该问题:
* 大致思想:
* 首先我们使用映射来表示数字和字母之间的对应关系,每个数字选择一个字母组合,有多少个数字我们就需要选择多少次。
* 我们的想法是我们先按顺序遍历每一个个节点,对于每个节点我们都做一个递归操作,直到递归的-终点也就是遍历到最后一个节点的时候我们得到一个结果。
*
* 递归详细设计:
* 递归的出口为我们遍历完所有的数字,就选择了一组排列,这个时候递归可以结束,并将结果放入到集合中。
* 递归的过程:我们对每一个数字,先取出它对应的所有字母,然后按顺序遍历取出它其中一个字母,将字母放入到我们结果中,然后通过递归将任务交到下一个数字处处理
* 等待第二个数字处理完成后,我们回到第一次遍历的下一个元素,再进行一次回溯。这样我们就可以遍历到所有元素的组合结果。举个例子:这有点像我们日常穿搭,比如说我们要选择袜子和鞋子的
* 组合,我们有三双袜子,两双鞋子,正如如上的过程一样我们先选择一双袜子,然后选择鞋子,穿着一双袜子试过所有的鞋子之后,返回来,换一双袜子,再试所有的鞋子,直到把所有的情况都试过为止。
*
* */
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Practice17 {
public static void main(String[] args) {
System.out.println(new Practice17().letterCombinations("23"));
}
public List<String> letterCombinations(String digits) {
ArrayList<String> combinations = new ArrayList<String>();
//判断参数
if(digits == ""){
return combinations;
}
//使用映射来代表数字和字母的对应关系
HashMap<Character,String> map = new HashMap<Character,String>();
map.put('2',"abc");
map.put('3',"def");
map.put('4',"ghi");
map.put('5',"jkl");
map.put('6',"mno");
map.put('7',"pqrs");
map.put('8',"tuv");
map.put('9',"wxyz");
recall(combinations,new StringBuffer(),map,digits,0);
return combinations;
}
/**
* @param combinations:所有结果的集合
* @param combination:一次遍历的结果
* @param map:数字和字母映射的关系
* @param digits:我们所需要处理的数字
* @param:index:正在遍历哪一个数字
* */
public void recall(ArrayList<String> combinations,StringBuffer combination,HashMap<Character,String> map,String digits,int index){
if(index == digits.length()){
combinations.add(combination.toString());
}else {
String letters = map.get(digits.charAt(index));
int length = letters.length();
for(int i = 0;i < length;i++){
combination.append(letters.charAt(i));
recall(combinations,combination,map,digits,index+1);
combination.deleteCharAt(index);
}
}
}
}
电话号码字母组合java代码回溯法力扣
最新推荐文章于 2022-03-23 20:39:58 发布
这篇博客介绍了如何使用回溯法解决将数字映射为字母组合的问题。作者通过创建数字与字母的映射关系,实现了一个递归算法,遍历所有可能的组合并将其存入结果集合中。此方法类似于穿搭选择,通过逐个数字选择字母并回溯以找到所有可能的组合。
摘要由CSDN通过智能技术生成