力扣top100-17. 电话号码的字母组合-回溯

题目:

链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
image

示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]

准备:

数据方面得有个Map来存放(5,"jkl")
得需要一个数组存放答案列表

算法选择-回溯

如果是遍历的话,时间复杂度可能要要起飞
但是可以考虑,取第i个数字为5,相当于这个字符串可能是xxxxjxxxx,xxxxkxxxx,xxxxlxxxx
这样答案就能构成一个树型结构
遍历答案树怎么做??回溯啊

具体方案

用一个字符串,最好是个StringBuilder,可变的,类似于遍历树一样,不断的回溯
应该还算简单

具体代码

public class T0017 {
    public List<String> letterCombinations(String digits) {
        List<String> res    =new ArrayList<>();//答案列表
        if(digits==null){//边界条件判断
            return null;
        }else if (digits.length()==0)return res;

        StringBuilder sb=new StringBuilder();//类似于答案的递归栈,要么全局,要么往方法中传参
        Map<Character,String> numMap=new HashMap<>(){{
            put('2', "abc");
            put('3', "def");
            put('4', "ghi");
            put('5', "jkl");
            put('6', "mno");
            put('7', "pqrs");
            put('8', "tuv");
            put('9', "wxyz");
        }};
        function(digits,numMap,sb,0,res);
        return res;
    }
    public void function(String digits,Map<Character,String> numMap,StringBuilder sb,int i,List<String> res){
        if(i==digits.length()){
            //res.add(new String(String.valueOf(sb)));
            res.add(sb.toString());
            return;
        }
        String sub=numMap.get(digits.charAt(i));//取出数字对应的几个字符
        for (int j = 0; j < sub.length(); j++) {
            sb.append(sub.charAt(j));//插入元素
            function(digits,numMap,sb,i+1,res);//遍历下一个数字
            sb.deleteCharAt(i);//回溯,弹出元素
        }
    }
}
posted @ 2022-03-03 21:30  荧惑微光  阅读(59)  评论(0编辑  收藏  举报