欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode hot100------17.电话号码的字母组合

程序员文章站 2022-07-14 14:37:46
...

回溯(backtrack):
穷举多维度数据的方法,可以想作是多维度的exhaustive search详尽的搜索.

大意是:把多维度数据看作是一个多维向量(solution vector),然后运用递回依序递回穷举各个维度的值,制作出所有科恩个数据(solution space),并且在递回途中避免列举出不正确的数据。

 backtrack([v1,...,vn])  {  //[v1,...,vn]是多维度的向量
 //制作出了一组数据,并检验这组数据正不正确
 if([v1,...,vn] is well  - generated){
 	if([v1,...,vn] is a solution) process solution;
 	return;
 }
 //穷举这个维度的所有值,并递回到下一个维度
 for(x=possible values of vn + 1)
 	backtrack([v1,...,vn, x]);
 }
 call backtrack ([]); //从第一个维度开始逐步穷举
class Solution {
    public List<String> letterCombinations(String digits) {
        //创建一个List,用来放组合的字母
        List<String> combinations = new ArrayList<String>();
        //如果输入的digits是空的,那么直接返回空的combinations
        if(digits.length() == 0){
            return combinations;
        }
        //创建一个hashmap,将phone数字对应的字母放进去
        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回溯
        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){
        //index???
        if(index == digits.length()){
            //用于返回一个表示指定char值的String对象,将combination的值转化成字符串string
            combinations.add(combination.toString());
        }
        else{
        //string.charAt()--> 用于返回制定索引处的字符
        //使用 charAt(int index)方法是一个能够用来检索特定索引下的字符的String实例的方法
        char digit = digits.charAt(index);
        //phoneMap.get(digit)-->phoneMap指定digit(key)对应的Value-->赋给letters
        String letters = phoneMap.get(digit);
        //letters的长度赋给lettersCount
        int lettersCount = letters.length();
        for (int i = 0; i < lettersCount; i++){
            //.append增加,往combination上增加letters对应key是i上的value
            combination.append(letters.charAt(i));
            //index + 1 ????
            backtrack(combinations, phoneMap, digits, index + 1, combination);
            combination.deleteCharAt(index);
        }
    }
   }
}






复杂度分析

时间复杂度:O(3^m
4^n)
,其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),n 是输入中对应 4 个字母的数字个数(包括数字 7、9),m+n 是输入数字的总个数。当输入包含 m 个对应 3 个字母的数字和 n 个对应 4 个字母的数字时,不同的字母组合一共有 3^m
4^n 种,需要遍历每一种字母组合。

空间复杂度:O(m+n),其中 m 是输入中对应 3 个字母的数字个数,n 是输入中对应 4 个字母的数字个数,m+n 是输入数字的总个数。除了返回值以外,空间复杂度主要取决于哈希表以及回溯过程中的递归调用层数,哈希表的大小与输入无关,可以看成常数,递归调用层数最大为 m+n。

相关标签: leetcode hot100