leetcode 17 电话号码的字母组合 -- 回溯

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述
示例:

输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

分析:每个数组对应不同的字母,因此我们需要使用一个hashmap存储不同的数字映射到不同的字母。
同时创建一个list来存储答案,编写回溯函数,每个数字对应的有很多选择,当某种选择到达终点时,需要撤销这种选择,换下一种选择,回溯函数需要传入 存储答案的list列表,数字字符串digits,以及这个字母的下标index,当index等于digits的长度时,说明已经到达尽头,将该答案加入list中,然后撤销该选择,继续下一种

class Solution {
    public List<String> letterCombinations(String digits) {
       List<String> combinations = new ArrayList<String>();
       int n = digits.length();

       if(n==0){
           return combinations;
       }

       //建立数字和字母对应的哈希表
       Map<Character,String> phoneMap = new HashMap<Character,String>(){{
           put('2',"abc");
           put('3',"def");
           put('4',"ghi");
           put('5',"jkl");
           put('6',"mno");
           put('7',"pqrs");
           put('8',"tuv");
           put('9',"wxyz");
       }};

       //调用回溯算法
       backtrack(combinations,phoneMap,digits,0,new StringBuffer()); 
       return combinations;
    }

    //回溯算法
    public void backtrack(List<String> combinations,Map<Character,String> phoneMap,String digits,int index,
    StringBuffer combination){
        //如果字符长度已经达到数字的长度 则添加进去
        if(index == digits.length()){
            combinations.add(combination.toString());
        }else{

            //读取对应下标的数字
            char digit = digits.charAt(index);
            //去读数组对应的hashmap
            String letters = phoneMap.get(digit);
            int lettersCount = letters.length();

            for(int i = 0;i < lettersCount;i++){
                combination.append(letters.charAt(i));
                //继续调用下一位
                backtrack(combinations,phoneMap,digits,index+1,combination);
                //回溯完以后,需要撤销选择
                combination.deleteCharAt(index);
            }

        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值