Leetcode刷题(二十二)

电话号码的字母组合(Medium)

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

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

输入:digits = ""
输出:[]
示例 3:

输入:digits = "2"
输出:["a","b","c"]
提示:

0 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
Related Topics
哈希表
字符串
回溯

Leetcode刷题(二十二)_第1张图片

思路分析

这道题提示使用回溯算法,回溯算法属于深度优先遍历的一种实际应用,究其本质就是一种穷举方法。在这道题中我是用递归来完成整个深度优先的遍历。
首先定义了列表conbination来储存结果,index代表遍历到那一层(也就是哪一个数字),递归函数中的循环条件i代表的是每个数字代表的字母个数,循环遍历数字代表的所有字母,然后和前面的数字所代表的字母组合起来,直到最后一个数字的字母完成组合,此时index的值应该等于数字数量,这就是递归跳出条件。不断进行确定前一个数字代表的字母,穷举下一个数字代表的字母,与前一个组合。
这种穷举方法我在同专栏的文章Leetcode刷题(十七)——盛水最多容器这道题的笔记中记录的递归穷举三个数字的所有组合的原理是相似的。

Leetcode刷题(二十二)_第2张图片

代码实现

//leetcode submit region begin(Prohibit modification and deletion)
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

class Solution {
    public List<String> letterCombinations(String digits) {
        if (digits == null || digits.isEmpty()) {
            return new ArrayList<>();
        }

        HashMap<Character, String> map = new HashMap<>();
        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");

        return getAllCombinations(digits, map);
    }

    public static List<String> getAllCombinations(String dights, HashMap<Character , String> map){
        List<String> combination = new ArrayList<>();
        String letterConbin = "";
        combine(dights, 0, map, combination, letterConbin);
        return combination;
    }

    private static void combine(String dights, int index, HashMap<Character , String> map, List<String> combination, String letterConbin){
        if (index == dights.length()){
            combination.add(letterConbin);
            return;
        }

        String temp = letterConbin;
        for (int i = 0; i < map.get(dights.charAt(index)).length(); i++){
            temp = letterConbin + map.get(dights.charAt(index)).charAt(i);
            combine(dights, index+1, map, combination, temp);
        }

    }

}
//leetcode submit region end(Prohibit modification and deletion)

你可能感兴趣的:(Leetcode刷题实录,leetcode,算法)