力扣17. 电话号码的字母组合(java 回溯法)

Problem: 17. 电话号码的字母组合

文章目录

题目描述

思路

题目给定一串数字,要求我们找出所有可能的字母组合,即我们可以穷举 出所有可能的结果,而涉及到穷举 我们自然可以想到利用回溯 来解决问题,在本题目中我们选择给定字符串digits中的每一个字符作为决策阶段,具体的:

1.我们先创建一个哈希表 将数字与其对应的字符存入(数字作为键,所有的字符作为值)

2.编写,并调用回溯函数,当决策阶段 等于digits的长度时,将当前的决策路径添加到结果集合中,否则从digits字符串的第一个字符开始回溯调用!

解题方法

1.创建结果集合result,若当digits为空时,返回空集合;

2.创建一个String类型的数组mappings作为哈希表,索引从0-9,用于存储数字与其字符的对应关系,其中数字索引作为键,所有的字符作为值;

3.创建一个char类型的数组,数组长度为digits字符串的长度,作为回溯过程中的决策路径 ;

4.编写并调用回溯函数,参数列表为(String\[\] mappings, String digits, int k, char\[\] path),其中由参数mappings 与digits决定参数列表,k表示决策阶段,path表示决策路径

4.1若k等于digits的长度时,表示找到一个字母组合,则将其添加到结果集合result中,

4.2先得到当前决策阶段的digits中的数字字符 ,再通过我们创建的哈希表mappins找出该数字字符对应的所有字母字符

4.3以当前的数字字符对应得所有字母字符开始,遍历所有得字母字符并开始回溯调用
注意:在上述解题方法中我们没有显示地在回溯调用后将当前的决策阶段状态还原 (回溯的本质就是一个多状态转移 )但这并不表示我们没有实现该操作,而是因为:我们定义的决策阶段是一个char类型的数组,再回溯递归的调用过程中会将原来索引位置上的值给覆盖掉,以达到恢复当前决策阶段的操作

复杂度

时间复杂度:

最坏时间复杂度: O ( 3 m × 4 n ) O(3^m \times 4^n) O(3m×4n),其中m表示选择对应只有三个字母的数字的个数,n表示对应四个字母的个数

空间复杂度:

O ( n + m ) O(n + m) O(n+m)

Code

java 复制代码
class Solution {
    //Result list
    private List<String> result = new ArrayList<>();

    /**
     * Get the all possible combinations
     *
     * @param digits The combination given by topic
     * @return List<String>
     */
    public List<String> letterCombinations(String digits) {
        if (digits.length() == 0) {
            return Collections.emptyList();
        }
        //Create the reflection
        String[] mappings = new String[10];
        mappings[2] = "abc";
        mappings[3] = "def";
        mappings[4] = "ghi";
        mappings[5] = "jkl";
        mappings[6] = "mno";
        mappings[7] = "pqrs";
        mappings[8] = "tuv";
        mappings[9] = "wxyz";
        //Decision path
        char[] path = new char[digits.length()];
        backtrack(mappings, digits,0, path);
        return result;
    }

    /**
     * Use backtracking to find all possible combinations
     *
     * @param mappings Mapping between letters and numbers
     * @param digits   Combination of numbers given by topic
     * @param k        Decision stage
     * @param path     Decision path
     */
    private void backtrack(String[] mappings, String digits, int k, char[] path) {
        //End condition
        if (k == digits.length()) {
            result.add(new String(path));
            return;
        }
        String mapping = mappings[digits.charAt(k) - '0'];
        for (int i = 0; i < mapping.length(); ++i) {
            path[k] = mapping.charAt(i);
            backtrack(mappings, digits, k + 1, path);
        }
    }
}
相关推荐
曹牧7 小时前
C#:空合并运算符
java·前端·数据库
布吉岛的石头7 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
golang学习记8 小时前
IDEA 2026年的玩法已经完全不同
java·ide·intellij-idea
紧跟先前的步伐8 小时前
Go AI Agent 实战 05|Temperature 与生成参数:让模型输出可控
java·人工智能·golang
金銀銅鐵8 小时前
[Java] 展示添加元素时 ArrayList 的内部变化
java·后端·ai编程
斌糖雪梨8 小时前
spring auth 核心流程详解
java·后端·spring
罗湖老棍子9 小时前
【例 1】Sightseeing Trip(信息学奥赛一本通- P1494)(洛谷-P10927)
数据结构·算法·图论·最短路·floyd·最小环
文丑颜不良啊10 小时前
LeetCode201~225题目解析
java·leetcode
SL_staff12 小时前
4G设备掉线三层归因指南:SIM卡、模组、JVS-IOT网关配置精准锁定
java·物联网·产品
stsdddd12 小时前
YOLO算法建筑工地安全帽目标检测数据集16881张:标注核对笔记
算法·yolo·目标检测