问题描述:

题目:Leetcode 第17题

难度:中等

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

BFS解法:

这道题我们可以把字母逐个排列组合的过程,看成一棵,如图:

实际上这就很像一颗n叉树 。借用二叉树BFS的知识我们一行一行的遍历,便可以组出来。

二叉树BFS代码:

void levelorder(TreeNode tree){//借用一个队列做辅助queue<TreeNode> res;res.push(tree);while (!res.empty()){TreeNode temp = res.front();res.pop();//这里可以加一步,即访问temp//遍历当前节点的左子节点和右子节点if (temp.left != NULL)res.push(temp.left);if (temp.right != NULL)res.push(temp.right);}}

因为最多有两个子节点所以是二叉树,如果最多有n个子节点我们可以称它为n叉树, 那么n叉树的子节点比较多,我们不可能一次性全部写完,可以使用for循环来遍历, 代码如下:

void levelorder(TreeNode root){//借用一个队列做辅助queue<TreeNode> res;res.push(root);while (!res.empty()){TreeNode temp = res.front();res.pop();//这里可以加一步,即访问temp//再遍历当前节点的所有子节点for (int i = 0;i < temp.child.count;i++)//temp.child.count表示temp子代数量res.push(temp.child[i]);}}

搞懂了上面的代码,我们来看看这道题。这道题中的树是我们想象的,那我们怎么确定走到叶子节点了呢?其实如果有n个 数字,那么叶子节点字符串的长度就应该是n。

最终代码:

class Solution {
public:vector<string> letterCombinations(string digits) {int n=digits.size();vector<string> v;queue<string> res;res.push("");if(n==0){return v;}//str1储存电话键上的数字对应的所有字符串vector<string> str1={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};while(res.front().size()!=n){string temp=res.front();res.pop();//digits.at(temp.size())-'2' 表示 digits上每个数 在电话键上对应的字符串//其中-'2'是因为要将digits上的字符转换成对应的数同时此数还要和str1里对应字符串下标对应//str2 就相当于 temp的子代string str2=str1[digits.at(temp.size())-'2'];for(int i=0;i<str2.size();i++){res.push(temp+str2[i]);}}int m=res.size();for(int i=0;i<m;i++){v.push_back(res.front());res.pop();}return v;}
};

DFS解法:

除了BFS自然会想到DFS,特殊的是这里往回走的时候并不需要撤销选 择,因为字符串每次都会生成一个新的对象。

具体代码:

class Solution {
public:queue<string> res;void DFS( string digits, string str, vector<string>& str1, int index){if (str.size() == digits.size()){//到叶子节点了,就把这条路径选择的字符添加到res中res.push(str);}else{string str2 = str1[digits.at(index) - '2'];//访问当前节点的所有子节点for (int i = 0;i < str2.size();i++){DFS( digits, str + str2[i], str1, index + 1);}}/***  res*  index 表示访问到第几个数字了,也可以认为访问到树的第几层了*  digits*  tab*  path 从根节点到叶子结点的路径*/}vector<string> letterCombinations(string digits){int n = digits.size();vector<string> v;if (n == 0){return v;}//str1储存电话键上的数字对应的所有字符串vector<string> str1 = { "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };DFS( digits, "", str1, 0);int m = res.size();for (int i = 0;i < m;i++){v.push_back(res.front());res.pop();}return v;}
};

树:BFS,DFS解Leetcode电话号码的字母组合问题相关推荐

  1. Leetcode 电话号码的字母组合

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

  2. leetcode:电话号码的字母组合--java,dfs

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

  3. [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]

    [问题描述][中等] [解答思路] 1. DFS 深度优先遍历 时间复杂度:O(N+M) 空间复杂度:O(N) class Solution {private static final int UNC ...

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

    [DFS|回溯法] leetcode 17 电话号码的字母组合 1.题目 题目链接 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 ...

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

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

  6. [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]

    [问题描述][中等] [解答思路] 用哈希表/数组存储每个数字对应的所有可能的字母,然后进行回溯操作. 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是 ...

  7. LeetCode算法题17:电话号码的字母组合(Java版)

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

  8. LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 BFS + DFS 1. 题目 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置. 游戏地图用大小为 n * m 的网 ...

  9. Day25 LeetCode 216. 组合总和 III 17. 电话号码的字母组合

    题目:216. 组合总和 III - 力扣(LeetCode) 思路: 1.递归函数参数和返回值:首先需要两个全局变量一维path数组和二维result数组,path数组用来收集路径上的元素,resu ...

最新文章

  1. 固定table标题头、标题列(兼容多种浏览器)
  2. Vivado下几条 Verilog 综合规则
  3. Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5+1个样本)——类别预测
  4. 一些SAP UI5代码审查的例子
  5. Javascript组成--ECMAScript,DOM,BOM
  6. 客厅的WiFi在主卧收不到,什么方法简单便宜?
  7. CleanCodeHandbook Chapter 4: Binary Tree(25-32)
  8. 推荐几个好评率超高的公众号,有远见的程序员都关注了!
  9. windows播放声音
  10. 前端知识体系及修炼攻略
  11. 【问题6】Redis 的过期策略都有哪些?内存淘汰机制都有哪些?
  12. 保监会借大数据摸底保险中介市场
  13. 英文单词和数字断行不折叠
  14. Eclipse中Outline里各种图标的含义
  15. ubantu 安装 mosquitto时 connection refused 的解决办法
  16. Python编曲实践(九):如何计算并估计音乐的调性(大/小调+主音)?Krumhansl-Schmuckler调性分析算法的原理与实现
  17. Windows 下 OpenCV 3.4.0 + Contrib 部署文档 (VS2015 Android)
  18. ESP8266学习之路 十二 (读写文件)
  19. 学习java的心得体会_学习java的心得体会范文.doc
  20. 礼品 read.php,心愿送礼网教你如何体面的接受礼品

热门文章

  1. mysql 的事件_一文总结MySQL数据库事件--定时任务实现方式
  2. nginx修改文件上传大小配置
  3. arduino二位数码管_用arduino和2个74HC595级联控制8位数码管显示
  4. Cassandra初步学习和性能测试
  5. 如何重置 Mac 上的 NVRAM
  6. 区块链基础与网络安全
  7. 【Scratch考级99图】图26-等级考试scratch绘制复杂图形旋转三角形 少儿编程 scratch画图案例教程
  8. NK/DC细胞膜仿生脂质体药物载体|真核细胞膜包覆仿生纳米粒|肿瘤细胞膜包裹的仿生纳米颗粒
  9. 22-0002 天猫店铺搜索页面分析
  10. react-router v4 路由改变页面不刷新