力扣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);
        }
    }
}
相关推荐
点云SLAM25 分钟前
二叉树算法详解和C++代码示例
数据结构·c++·算法·红黑树·二叉树算法
拼搏@30 分钟前
第十六天,7月10日,八股
java·mybatis
Sylvia-girl4 小时前
Java——抽象类
java·开发语言
Touper.7 小时前
Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)
java·数据库·redis
m0_535064607 小时前
C++模版编程:类模版与继承
java·jvm·c++
今天背单词了吗9808 小时前
算法学习笔记:19.牛顿迭代法——从原理到实战,涵盖 LeetCode 与考研 408 例题
笔记·学习·算法·牛顿迭代法
虾条_花吹雪8 小时前
Using Spring for Apache Pulsar:Message Production
java·ai·中间件
tomorrow.hello8 小时前
Java并发测试工具
java·开发语言·测试工具
Moso_Rx8 小时前
javaEE——synchronized关键字
java·java-ee
jdlxx_dongfangxing8 小时前
进制转换算法详解及应用
算法