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

思路

  1. 使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作,穷举所有可能。
  2. 使用队列,类似广度优先。

代码实现

1. 回溯

class Solution {
    public List<String> letterCombinations(String digits) {
        List<String> combinations = new ArrayList<String>();
        if (digits.length() == 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()) {
            //如果index扫描到最后一个数字(给定输入串digits的最后一个字符,则添加当前结果)
            combinations.add(combination.toString());
        } else {
            char digit = digits.charAt(index);
            //获取当前数字对应的字符序列
            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);
            }
        }
    }
}

2. 队列

import java.util.*;

class Solution {
    public static void main(String[] args) {
        new Solution().letterCombinations("23");
    }
    public List<String> letterCombinations(String digits) {
        List<String> ans = new ArrayList<>();
        if (digits == null || digits.length() == 0){
            return ans;
        }
        Map<Character, String> map = 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");
        }};
        Queue<StringBuilder> queue = new ArrayDeque<>();
        int index = 0;
        while (index < digits.length()){
            if (queue.isEmpty()){
                for (Character character : map.get(digits.charAt(index)).toCharArray()) {
                    queue.add(new StringBuilder().append(character));
                }
                index++;
                continue;
            }
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                StringBuilder temp = queue.poll();
                for (Character character : map.get(digits.charAt(index)).toCharArray()) {
                    queue.add(new StringBuilder().append(temp).append(character));
                }
            }
            index++;
        }
        for (StringBuilder s : queue) {
            ans.add(s.toString());
        }
        return ans;
    }
}
posted @   Cedrus  阅读(45)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示