Leetcode17. 电话号码的字母组合(HashMap+深搜回溯)

Posted !0 !

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode17. 电话号码的字母组合(HashMap+深搜回溯)相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

解题思路

这是一道非常经典的深搜+回溯的题,一刚开始会很难适应递归回溯的这种逻辑,但是还是要慢慢去理解,写起来还是很方便的。
我们可以先用map来存储每个数字对应的有哪些字母,然后进行回溯操作。回溯过程中维护一个res字符串表示已有的字母排列。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。然后进行回退操作,遍历其余的字母排列。细节直接看代码。

代码

class Solution {
    List<String> ans = new ArrayList<>();   //存储最后答案
    Map<Character, String> map = 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");
        }
    };
    public List<String> letterCombinations(String digits) {
        if(digits.length() == 0)    //特判
            return ans;
        dfs(digits, 0, ""); //从第一个数字开始遍历,并且res字符串表示已有的字母排列
        return ans;
    }
    void dfs(String s, int i, String res) {
        if(i == s.length()) {   //如果遍历完字符串的长度,说明完成了一种情况
            ans.add(res);       //直接加入答案集合中
            return; 
        }
        String let = map.get(s.charAt(i));  //记录第i个数字可能出现的所有字母集
        for(int k = 0; k < let.length(); k++) { //遍历所有字母集
            res += let.charAt(k);   //选当前字母
            dfs(s, i + 1, res); //递归匹配后面的字母
            res = res.substring(0, i);  //回溯,不选当前字母
        }
    }
}

复杂度分析

  • 时间复杂度:O(3^m × 4^n),其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),n是输入中对应 4 个字母的数字个数
  • 空间复杂度:O(m + n)

以上是关于Leetcode17. 电话号码的字母组合(HashMap+深搜回溯)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 17.电话号码的字母组合

LeetCode #17 电话号码的字母组合

LeetCode17. 电话号码的字母组合

[LeetCode] 17. 电话号码的字母组合

[JavaScript 刷题] 搜索 - 电话号码的字母组合, leetcode 17

LeetCode 17. 电话号码的字母组合