树:BFS,DFS解Leetcode电话号码的字母组合问题
问题描述:
题目: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电话号码的字母组合问题相关推荐
- Leetcode 电话号码的字母组合
电话号码的字母组合 题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合.给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母 题目链接 class Solut ...
- leetcode:电话号码的字母组合--java,dfs
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...
- [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]
[问题描述][中等] [解答思路] 1. DFS 深度优先遍历 时间复杂度:O(N+M) 空间复杂度:O(N) class Solution {private static final int UNC ...
- [DFS|回溯法] leetcode 17 电话号码的字母组合
[DFS|回溯法] leetcode 17 电话号码的字母组合 1.题目 题目链接 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 ...
- LeetCode 17电话号码的字母组合(搜索)18四数之和
电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23 ...
- [Leetcode][第17题][JAVA][电话号码的字母组合][回溯]
[问题描述][中等] [解答思路] 用哈希表/数组存储每个数字对应的所有可能的字母,然后进行回溯操作. 回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是 ...
- LeetCode算法题17:电话号码的字母组合(Java版)
LeetCode传送门:电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: ...
- LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)
文章目录 1. 题目 2. 解题 2.1 超时解 2.2 BFS + DFS 1. 题目 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置. 游戏地图用大小为 n * m 的网 ...
- Day25 LeetCode 216. 组合总和 III 17. 电话号码的字母组合
题目:216. 组合总和 III - 力扣(LeetCode) 思路: 1.递归函数参数和返回值:首先需要两个全局变量一维path数组和二维result数组,path数组用来收集路径上的元素,resu ...
最新文章
- 固定table标题头、标题列(兼容多种浏览器)
- Vivado下几条 Verilog 综合规则
- Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5+1个样本)——类别预测
- 一些SAP UI5代码审查的例子
- Javascript组成--ECMAScript,DOM,BOM
- 客厅的WiFi在主卧收不到,什么方法简单便宜?
- CleanCodeHandbook Chapter 4: Binary Tree(25-32)
- 推荐几个好评率超高的公众号,有远见的程序员都关注了!
- windows播放声音
- 前端知识体系及修炼攻略
- 【问题6】Redis 的过期策略都有哪些?内存淘汰机制都有哪些?
- 保监会借大数据摸底保险中介市场
- 英文单词和数字断行不折叠
- Eclipse中Outline里各种图标的含义
- ubantu 安装 mosquitto时 connection refused 的解决办法
- Python编曲实践(九):如何计算并估计音乐的调性(大/小调+主音)?Krumhansl-Schmuckler调性分析算法的原理与实现
- Windows 下 OpenCV 3.4.0 + Contrib 部署文档 (VS2015 Android)
- ESP8266学习之路 十二 (读写文件)
- 学习java的心得体会_学习java的心得体会范文.doc
- 礼品 read.php,心愿送礼网教你如何体面的接受礼品
热门文章
- mysql 的事件_一文总结MySQL数据库事件--定时任务实现方式
- nginx修改文件上传大小配置
- arduino二位数码管_用arduino和2个74HC595级联控制8位数码管显示
- Cassandra初步学习和性能测试
- 如何重置 Mac 上的 NVRAM
- 区块链基础与网络安全
- 【Scratch考级99图】图26-等级考试scratch绘制复杂图形旋转三角形 少儿编程 scratch画图案例教程
- NK/DC细胞膜仿生脂质体药物载体|真核细胞膜包覆仿生纳米粒|肿瘤细胞膜包裹的仿生纳米颗粒
- 22-0002 天猫店铺搜索页面分析
- react-router v4 路由改变页面不刷新