057电话号码的字母组合

电话号码的字母组合

题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/?envType=study-plan-v2\&envId=top-100-liked

我的解答:

复制代码
int[] first = new int[]{0, 3, 6, 9, 12, 15, 19, 22, 26};
StringBuilder sb = new StringBuilder();
public List<String> letterCombinations(String digits) {
    List<String> ans = new ArrayList<>();
    backtrack(digits, 0, ans);
    return ans;
}
public void backtrack(String digits, int cur, List<String> ans){
    if(cur == digits.length()){
        ans.add(sb.toString());
        return;
    }
    int curIndex = digits.charAt(cur) - '2';
    //每一种字母都选一遍
    for(int i=first[curIndex]; i<first[curIndex+1]; i++){
        char ch = (char) (i + 'a');
        sb.append(ch);
        backtrack(digits, cur+1, ans);
        //回溯
        sb.deleteCharAt(cur);
    }
}

分析:

​ 代码的时间复杂度为O(3^m * 4^n),空间复杂度为O(m+n),其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),n 是输入中对应 4 个字母的数字个数(包括数字 7、9),m+n 是输入数字的总个数。

​ 解题思路:采用递归+回溯解题。用first数组维护每个数字能表示的第一个字母的下标(字母下标范围为0~25),递归遍历到digits中的每个数字时,将此数字能表示的字母都选择一遍,直到digits遍历完最后一个数字后收集答案。

看了官方题解后的解答:

复制代码
//方法:回溯
//时间复杂度:O(3^m * 4^n),其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),n 是输入中对应 4 个字母的数字个数(包括数字 7、9),m+n 是输入数字的总个数。
//空间复杂度:O(m+n)
public List<String> letterCombinations(String digits) {
    List<String> ans = new ArrayList<>();
    Map<Character, String> phoneMap = 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");
    }};
    backtrack(digits, 0, new StringBuffer(), phoneMap, ans);
    return ans;
}
public void backtrack(String digits, int cur, StringBuffer sb, Map<Character, String> phoneMap, List<String> ans){
    if(cur == digits.length()){
        ans.add(sb.toString());
        return;
    }
    char digit = digits.charAt(cur);
    String letters = phoneMap.get(digit);
    int lettersCount = letters.length();
    for(int i=0; i<lettersCount; i++){
        sb.append(letters.charAt(i));
        backtrack(digits, cur + 1, sb, phoneMap, ans);
        sb.deleteCharAt(cur);
    }
}

分析:官方的解题思路与我的解答一致,唯一的区别在于,我选择用数组first维护每个数字代表的字母,而官方采用哈希表维护。

总结

  • 本题只需掌握基本的递归+回溯方法,唯一需要思考的就是如何维护每个数字代表的字母。
相关推荐
徐小夕4 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao4 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
小豆庄5 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘566 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
y1su8 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan8 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
其实防守也摸鱼9 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机9 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS1009 小时前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构
CV爱数码10 小时前
CT 重建从零开始(五):ASTRA Toolbox 上手——几何、投影器与算法
图像处理·算法·计算机视觉·ct