首页 > 其他分享 >17_电话号码的字母组合

17_电话号码的字母组合

时间:2024-09-07 08:53:23浏览次数:13  
标签:digits idx 17 combination 字母 字符串 电话号码 ans 字母组合

17_电话号码的字母组合

【问题描述】

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。

img

示例一:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例二:
输入:digits = ""
输出:[]

示例三:
输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

【算法设计思想】

本题主要是用到了DFS,即深度优先搜索的思想。在此我们需要搞清楚DFS的基本思想和伪代码是怎么样的。

DFS的算法设计思想:一种用于遍历或搜索树或图的算法。DFS的基本思想是从根节点开始(选择某个搜索起始节点),先尽可能深的搜索树的分支,如果到底了(即到达一个叶子节点或者当前节点没有任何未访问的子节点),就回溯到上一层,继续尽可能深的搜索其它未搜索过的子节点,这个过程一直持续到所有的节点都被访问过为止。

伪代码如下:

procedure DFS(G,V):
	make V as visited;
	for each w in G.adjacent(v) do //遍历v的所有邻接顶点
		ifw is not visited then
		DFS(G,w)//递归访问w

我们可以把这个问题看成是一个搜索的问题,在这里,2对应abc,3对应def,我们只需要求其组合就可以了,本质上是一个树形的结构,我们对这个树进行DFS即可得到答案,所以通过本题我们要复习DFS这个知识点。

【算法描述】

C++:

class Solution
{
public:
    // 存储结果的容器
    std::vector<std::string> ans;

    // 字符串映射数组,对应数字键上的字母
    std::string strs[10] = {",", "", "abc", "def", "ghi", "jkl",
                            "mno", "pqrs", "tuv", "wxyz"};

    // 主要的方法,用于获取电话号码的字母组合
    std::vector<std::string> letterCombinations(std::string digits)
    {
        // 如果输入的数字字符串为空,则直接返回空的结果集
        if (digits.empty())
        {
            return ans;
        }

        // 从第一个数字开始深度优先搜索
        dfs(digits, 0, "");
        
        // 返回所有可能的组合
        return ans;
    }

    // 深度优先搜索 (DFS) 辅助方法
    void dfs(const std::string &digits, int idx, std::string combine)
    {
        // 当前索引等于输入字符串的长度时,说明已经处理完了一个完整的组合
        if (idx == digits.length())
        {
            // 将当前组合加入结果集中
            ans.push_back(combine);
            return;
        }

        // 获取当前数字对应的字母字符串
        const std::string &s = strs[digits[idx] - '0'];

        // 遍历当前数字对应的字母字符串
        for (size_t i = 0; i < s.length(); i++)
        {
            // 将当前字母添加到组合字符串中
            combine.push_back(s[i]);

            // 递归地进行下一步搜索
            dfs(digits, idx + 1, combine);

            // 回溯:移除最后一个字符,以便尝试下一个字母
            combine.pop_back();
        }
    }
};

Java:

import java.util.ArrayList;
import java.util.List;

class Solution {

    // 存储结果的容器
    private List<String> ans = new ArrayList<>();

    // 字符串映射数组,对应数字键上的字母
    private String[] strs = {",", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

    // 主要的方法,用于获取电话号码的字母组合
    public List<String> letterCombinations(String digits) {

        // 如果输入的数字字符串为空,则直接返回空的结果集
        if (digits.isEmpty()) {
            return ans;
        }

        // 从第一个数字开始深度优先搜索
        dfs(digits, 0, "");

        // 返回所有可能的组合
        return ans;
    }

    // 深度优先搜索 (DFS) 辅助方法
    private void dfs(String digits, int idx, String combination) {
        // 当前索引等于输入字符串的长度时,说明已经处理完了一个完整的组合
        if (idx == digits.length()) {
            // 将当前组合加入结果集中
            ans.add(combination);  // 修改为 add 而不是 append
            return;
        }

        // 获取当前数字对应的字母字符串
        String s = strs[digits.charAt(idx) - '0'];  // 使用 charAt 获得字符而不是使用索引

        // 遍历当前数字对应的字母字符串
        for (int i = 0; i < s.length(); i++) {
            // 将当前字母添加到组合字符串中
            combination += s.charAt(i);  // 使用 += 添加字符

            // 递归地进行下一步搜索
            dfs(digits, idx + 1, combination);

            // 回溯:移除最后一个字符,以便尝试下一个字母
            combination = combination.substring(0, combination.length() - 1);  // 使用 substring 方法回溯
        }
    }
}

Python:

from typing import List

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        # 结果容器
        ans: List[str] = []
        
        # 字符串映射字典,对应数字键上的字母
        strs = {
            ",": "",
            "": "",
            "2": "abc",
            "3": "def",
            "4": "ghi",
            "5": "jkl",
            "6": "mno",
            "7": "pqrs",
            "8": "tuv",
            "9": "wxyz"
        }

        # 如果输入的数字字符串为空,则直接返回空的结果集
        if not digits:
            return ans

        # 深度优先搜索 (DFS) 辅助方法
        def dfs(digits: str, idx: int, combination: str):
            # 当前索引等于输入字符串的长度时,说明已经处理完了一个完整的组合
            if idx == len(digits):
                ans.append(combination)
                return
            
            # 获取当前数字对应的字母字符串
            s = strs[digits[idx]]

            # 遍历当前数字对应的字母字符串
            for i in range(len(s)):
                # 将当前字母添加到组合字符串中
                combination += s[i]
                
                # 递归地进行下一步搜索
                dfs(digits, idx + 1, combination)
                
                # 回溯:移除最后一个字符,以便尝试下一个字母
                combination = combination[:-1]

        # 从第一个数字开始深度优先搜索
        dfs(digits, 0, "")
        
        # 返回所有可能的组合
        return ans

标签:digits,idx,17,combination,字母,字符串,电话号码,ans,字母组合
From: https://www.cnblogs.com/zeta186012/p/18401300

相关文章

  • 【读书笔记-《30天自制操作系统》-16】Day17
    本篇内容开始进入一个新的主题——命令行,这是一个操作系统很基本的功能。本篇中首先实现命令行窗口的显示,做到能切换到窗口以及实现向窗口输入内容。接下来在之前键盘输入的基础上,增加对符号以及大小写字母的输入。最后再加入对其他锁定键的支持。1.创建命令行窗口与窗口......
  • CF1715E. Long Way Home -决策单调性、图
    link:https://codeforces.com/contest/1715/problem/E有\(n\)座城市,城市间有\(m\)条双向道路,通过第\(i\)条道路需要花费\(w_i\)的时间,任意两个城市之间都有航班,乘坐城市\(u\)和\(v\)之间的航班需要花费\((u-v)^2\)的时间。现在请对于任意城市\(i(1\lei\len)\)......
  • Javascript应用(下拉框) 笔记17
    一个基础Html框架:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</t......
  • 第17篇 RabbitMQ安装详细步骤
    一.RabbitMQ是什么?RabbitMQ是一个由Erlang语言开发的AMQP的开源实现。​AMQP:AdvancedMessageQueue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。​RabbitMQ最......
  • 2024.08.17京东
    1.桩子与雪村子里有一些桩子,从左到右高度依次为1,1+2,1+2+3…,每两颗桩子之间的间隔为1.现在下了一场大雪,但是不知道雪下了多厚,现在给你两个数字,这是雪后某相邻两个桩子在雪面的高度,请你通过这两个数字计算雪的厚度。简单计算intmain(intargc,char*argv[]){inta,b......
  • dell r940 安装 pm1735 固态硬盘 添加命令
    在DellR940上安装SamsungPM1735SSD并正确添加到系统中的步骤,特别是使用NVMeSSD时,主要包括硬件安装和软件设置。假设你已经将PM1735插入PCIe插槽,以下是主要的命令步骤:1.确认设备是否被识别首先,检查系统是否识别了PM1735固态硬盘:bash复制代码lspci|grep-......
  • Cisco ISR 4000 IOS XE 17.15.1a 发布下载,新增功能概览
    CiscoISR4000SeriesIOSXERelease17.15.1aED思科4000系列集成服务路由器系统软件请访问原文链接:https://sysin.org/blog/cisco-isr-4000/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org思科4000系列集成服务路由器Cisco4000系列ISR、CiscoIOSXE1......
  • Cisco ISR 1000 IOS XE 17.15.1a 发布下载,新增功能概览
    CiscoISR1000SeriesIOSXERelease17.15.1aED思科1000系列集成多业务路由器系统软件请访问原文链接:https://sysin.org/blog/cisco-isr-1000/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org思科1000系列集成多业务路由器Cisco1000系列集成多业务路由器......
  • 南沙信C++陈老师解一本通题: 2031:【例4.17】四位完全平方数
    ​ 题目描述】输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。【输入】无【输出】由小到大输出,每个数占一行。【输入样例】无【输出样例】无#include<bits/stdc++.h>usingnamespacestd;boolisSquare(intn){ inttmp=(int)sqrt(n......
  • 2024.9.5 leetcode 3174 清除数字(字符串)
    题面3174.清除数字-力扣(LeetCode)题解:今天的每日一题比较简单,思路是遍历字符串,遇到第一个数字x的时候,把数字x和前面的字母y删除,也就是删除yx。1、为什么前面一定是字母,因为遇到的是第一个数字,前面不可能再有数字。2、如何实现删除yx,重新定义一个字符串,每一次遍历将y前面的字......