前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >☆打卡算法☆LeetCode 17、电话号码的字母组合 算法解析

☆打卡算法☆LeetCode 17、电话号码的字母组合 算法解析

作者头像
恬静的小魔龙
发布2022-08-07 09:53:14
2650
发布2022-08-07 09:53:14
举报
文章被收录于专栏:Unity3DUnity3D
大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。

一、题目

1、算法题目

“返回给定仅包含数字2-9的字符串的所有可能的字母组合。”

题目链接:

来源:力扣(LeetCode)

链接:17. 电话号码的字母组合 - 力扣(LeetCode) (leetcode-cn.com)

2、题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

image.png
image.png
代码语言:javascript
复制
示例 1:
输入: digits = "23"
输出: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
代码语言:javascript
复制
示例 2:
输入: digits = "2"
输出: ["a","b","c"]

二、解题

1、思路分析

这道题可以先使用哈希表存储每个数字对应的所有可能的字母,然后找到所有解即可。

每次取一位数字,然后从哈希表中枚举所有可能的字母,并将其中的一个字母插入到已有字母的后面,然后继续处理下一位数字,直到处理完所有数字,得到一个字母数组。

当题目中出现所有组合字样的时候,就要考虑要用回溯法,使用回溯算法找到所有的可行解,发现一个解不行,舍弃不可行的解,穷举所有解即可。

2、代码实现

电话号码的组合本质上就是笛卡尔积,使用linq写法即可:

代码语言:javascript
复制
public class Solution {
    public IList<string> LetterCombinations(string digits) {
            IList<string> result = new List<string>();
            if (string.IsNullOrEmpty(digits))
            {
                return result;
            }
            Dictionary<char, string> phoneDic = new Dictionary<char, string>() {
                {'2',"abc" },
                {'3',"def" },
                {'4',"ghi" },
                {'5',"jkl" },
                {'6',"mno" },
                {'7',"pqrs" },
                {'8',"tuv" },
                {'9',"wxyz" },
            };
            if (digits.Length == 1)
            {
                string temp = phoneDic[digits[0]];
                for (int i = 0; i < temp.Length; i++)
                {
                    result.Add(temp[i].ToString());
                }
                return result;
            }
            List<string> temps = new List<string>();
            for(int i = 0; i < digits.Length; i++)
            {
                temps.Add(phoneDic[digits[i]]);
            }
            var tempResult = from m in temps[0]
                         from n in temps[1]
                         select new string("" + m + n);
            for(int i = 2; i < temps.Count; i++)
            {
                string temp = temps[i];
                tempResult = from m in tempResult
                             from n in temp
                             select new string("" + m + n);
            }
            result = tempResult.ToList();
            return result;
    }
}
image.png
image.png

3、时间复杂度

时间复杂度 : O(N)

空间复杂度: O(1)

三、总结

回溯算法,可以用来寻找所有的可行解。

在题目中出现找出所有组合的字样的时候,就要想到是否可以用回溯算法。

在使用回溯算法的时候如果发现一个解不可行,则会舍弃不可行的解。

在这道题中,由于每个数字对应的每个字母都可能进入字母组合,因此不存在不可行的解,直接穷举所有的解即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目
    • 1、算法题目
      • 2、题目描述
      • 二、解题
        • 1、思路分析
          • 2、代码实现
            • 3、时间复杂度
            • 三、总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档