电话号码字母组合java代码回溯法力扣

这篇博客介绍了如何使用回溯法解决将数字映射为字母组合的问题。作者通过创建数字与字母的映射关系,实现了一个递归算法,遍历所有可能的组合并将其存入结果集合中。此方法类似于穿搭选择,通过逐个数字选择字母并回溯以找到所有可能的组合。
摘要由CSDN通过智能技术生成

/**
 * 本题使用回溯法解决该问题:
 * 大致思想:
 * 首先我们使用映射来表示数字和字母之间的对应关系,每个数字选择一个字母组合,有多少个数字我们就需要选择多少次。
 * 我们的想法是我们先按顺序遍历每一个个节点,对于每个节点我们都做一个递归操作,直到递归的-终点也就是遍历到最后一个节点的时候我们得到一个结果。
 * 
 * 递归详细设计:
 * 递归的出口为我们遍历完所有的数字,就选择了一组排列,这个时候递归可以结束,并将结果放入到集合中。
 * 递归的过程:我们对每一个数字,先取出它对应的所有字母,然后按顺序遍历取出它其中一个字母,将字母放入到我们结果中,然后通过递归将任务交到下一个数字处处理
 * 等待第二个数字处理完成后,我们回到第一次遍历的下一个元素,再进行一次回溯。这样我们就可以遍历到所有元素的组合结果。举个例子:这有点像我们日常穿搭,比如说我们要选择袜子和鞋子的
 * 组合,我们有三双袜子,两双鞋子,正如如上的过程一样我们先选择一双袜子,然后选择鞋子,穿着一双袜子试过所有的鞋子之后,返回来,换一双袜子,再试所有的鞋子,直到把所有的情况都试过为止。
 * 
 * */




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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值