leetcode17. 电话号码的字母组合(java)

电话号码的字母组合

leetcode17. 电话号码的字母组合

难度 中等
leetcode17 跳转链接

题目描述

给定一个仅包含数字 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'] 的一个数字。

回溯算法

对于字符串 ds 中的每一位数字,都有其对应的字母映射数组。

在 DFS 中决策每一位数字应该对应哪一个字母,当决策的位数 i == n,代表整个 ds 字符串都被决策完毕,将决策结果添加到结果集:
回溯算法流程:

1.路径:也就是已经做出的选择。

2.选择列表:也就是你当前可以做的选择。

3.结束条件:也就是到达决策树底层,无法再做选择的条件。

伪代码框架

java 复制代码
result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return
    
    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

代码演示

java 复制代码
class Solution {
     Map<String, String[]> map = new HashMap<>(){{
        put("2", new String[]{"a", "b", "c"});
        put("3", new String[]{"d", "e", "f"});
        put("4", new String[]{"g", "h", "i"});
        put("5", new String[]{"j", "k", "l"});
        put("6", new String[]{"m", "n", "o"});
        put("7", new String[]{"p", "q", "r", "s"});
        put("8", new String[]{"t", "u", "v"});
        put("9", new String[]{"w", "x", "y", "z"});
    }};
    ArrayList<String> ans = new ArrayList<>();
    int n;
    String _ds ;
    public List<String> letterCombinations(String ds) {
        n = ds.length();
        if (n == 0){
            return ans;
        }
        _ds = ds;
        dfs(0,new StringBuilder());
        return ans;
    }

    public void dfs(int index,StringBuilder sb){
        if (index == n){
            ans.add(sb.toString());
            return;
        }
        String key = _ds.substring(index,index + 1);
        String[] values = map.get(key);
        //选择列表
        for (String v : values){
        //做出选择
            sb.append(v);
            //回溯
            dfs(index + 1,sb);
            //撤销选择
            sb.deleteCharAt(sb.length() - 1);
        }
    }
}

回溯算法

leetcode93. 复原 IP 地址

leetcode306. 累加数

leetcode1219. 黄金矿工

相关推荐
qq_12084093712 分钟前
Three.js 工程向:Clock、deltaTime 与固定步长主循环
开发语言·javascript·ecmascript
小菜同学爱学习4 分钟前
夯实基础!MySQL数据类型进阶、约束详解与报错排查
开发语言·数据库·sql·mysql
迷藏4945 分钟前
# 发散创新:基于Selenium的自动化测试框架重构与实战优化在当今快速迭代的软件开
java·python·selenium·测试工具·重构
吴可可1238 分钟前
C#合并首尾相连多段线实战
算法·c#
源码站~15 分钟前
基于机器学习的社交媒体舆情分析系统
开发语言·python
Nyarlathotep011325 分钟前
LockSupport工具类
java·后端
jieyucx25 分钟前
Go 语言零基础入门:编写第一个 Hello World 程序
开发语言·后端·golang
沐知全栈开发30 分钟前
Rust 数据类型
开发语言
阿巴斯甜30 分钟前
BiFunction的使用
java
XiYang-DING33 分钟前
【Java EE】多线程(1)
java·python·java-ee