[DFS|回溯法] leetcode 17 电话号码的字母组合

1.题目

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

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

2.分析

2.1.回溯法

看到题干中的能表示的组合字样,我们的第一反应应该就是利用回溯法来枚举所有的组合然后进行筛选。事实上本题连筛选的过程都没有,就是单纯的枚举。
本题是一个用来初学回溯法的很好例题

2.2.数据结构定义

首先要解决的是"数字到字符串的映射"这一问题。而由于索引用的直接就是数字,因此可以用数组来表示这一映射。如果复杂些(例如字符串到字符串的映射)那么就可能需要用map。
在这里出于习惯我们使用vector来代替数组:

//例如我们要取字符'3'对应的字符串("def"),只需要
//strs['3'-'0'-2]
vector<string> strs = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

2.3.DFS方法

void dfs(int k, string cur) {//k=n表示已遍历完输入串的最后一个字符if(k >= n) {//存储结果res.push_back(cur);return;}//对于输入digits的第k个字符,考虑其所有可能的选择情况for(int i = 0; i < strs[digit[k] - '0'- 2].size(); i++) {dfs(k + 1, cur + strs[digit[k] - '0' - 2][i]);}
}

cur表示当前分支对应的字符串
k表示当前遍历到输入字符串digits的第k个字符
n表示输入字符串digits的长度
res用于存储所有可能的结果

3.代码

class Solution {public:vector<string> res;//存储结果string digit;//即digitsint n;//数字到字符串的映射vector<string> strs = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};void dfs(int k, string cur) {//k=n表示已遍历完输入串的最后一个字符if(k >= n) {//存储结果res.push_back(cur);return;}//对于输入digits的第k个字符,考虑其所有可能的选择情况for(int i = 0; i < strs[digit[k] - '0'- 2].size(); i++) {dfs(k + 1, cur + strs[digit[k] - '0' - 2][i]);}}vector<string> letterCombinations(string digits) {//输入为空串时不能返回[""],而是[]if(digits.size() == 0) {return {};}    n = digits.size();digit = digits;dfs(0, "");return res;}
};

[DFS|回溯法] leetcode 17 电话号码的字母组合相关推荐

  1. LeetCode 17电话号码的字母组合(搜索)18四数之和

    电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23 ...

  2. LeetCode 17. 电话号码的字母组合(回溯)

    文章目录 1. 题目信息 2. 解题 1. 题目信息 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: ...

  3. leetcode 17. 电话号码的字母组合 思考分析

    题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 思考与递归程序 解空间树的宽度是输入数字对应的字符的个 ...

  4. leetcode —— 17. 电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...

  5. [LeetCode] 17. 电话号码的字母组合

    1 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输 ...

  6. leetcode 17. 电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...

  7. C++ leetcode 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

    一.解题思路 用map可以加快查询速度,DFS深度搜索,DFS是一种很常见的对于多循环或者n!的好的搜索算法. 二.代码:C++ void init(map<char, string> & ...

  8. LeetCode 17 电话号码的字母组合

    https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/ 解决方案 class Solution {public ...

  9. leetcode 17.电话号码的字母组合

    题目 解法 BFS + hash /* 广度遍历,利用队列实现 */ class Solution {private:unordered_map<char,string> tel_map; ...

最新文章

  1. 如何理解物体的6D位姿估计任务?
  2. intellij 打开node项目 一直停留在scanning files to index....,或跳出内存不够的提示框...
  3. 简单说一下elasticsearch安装
  4. python扑克牌洗牌_python:面向对象基本知识(二)用类方法实现斗地主洗牌发牌...
  5. iOS与Opencv的探秘之Opencv认识,适配Xcode
  6. Vmware虚拟机三种网络模式配图详解
  7. android自带下拉阻尼动画,android 有阻尼下拉刷新列表的实现方法
  8. SpaceX和美国宇航局计划明年4月向国际空间站发射Crew-4
  9. 统计.html,分类统计.html
  10. js中java式的类成员
  11. 188.买卖股票的最佳时机IV
  12. 标签打印软件中标签间距以及边距如何设置
  13. php 开发 oa 框架,基于ThinkPHP框架开发的全功能OA办公管理系统PHP源码
  14. 一个好用的hibernate泛型dao
  15. 大宗商品交易平台支持多种交易模式,你了解多少?
  16. 快速了解元宇宙的 7 层产业链
  17. 丢手帕程序C语言,约瑟夫问题,即丢手帕游戏
  18. Dijkstra最短路径算法——java代码实现
  19. R语言计算logistic回归C指数,最详细的基于R语言的Logistic Regression(Logistic回归)源码,包括拟合优度,Recall,Precision的计算...
  20. 网易考拉卖身阿里的前夜:HR欲哭无泪,太难了。

热门文章

  1. kotlin 扩展函数_在 Kotlin 中“实现”trait/类型类
  2. android开发标签栏应该设置多少,Android开发笔记(十九)底部标签栏TabBar
  3. java epoch time_Java LocalDate ofEpochDay()用法及代码示例
  4. (第八章)左右外连接
  5. HTTP的请求报文响应报文
  6. python实验指导书答案函数代码复用_#Python学习笔记(5)函数和代码重用,复用
  7. api postmain 鉴权_API鉴权
  8. 机器学习决策树_机器学习与数据科学决策树指南
  9. spark中local模式与cluster模式使用场景_Spark内核及通信框架概述-针对面试(后面有源码分析)...
  10. Super-palindrome 模拟+思维