【4.10】图搜索算法-BFS和DFS解电话号码的字母组合

embedded/2024/10/18 21:12:22/

一、题目

        给定一个仅包含数字 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思路:
        每一个数字对应3到4个字符,我们以示例一为例画个图来 看一下

        我们看到实际上就是一颗n叉树, 除了叶子节点外,每个节点都有3到4个子节点 。对于二叉树的BFS遍历如下图所示,也就是一行一行的访问

        由于每个节点最多有两个子节点,因此我们可以将其视为二叉树。如果每个节点最多有n个子节点,我们可以称之为n叉树。对于n叉树,由于子节点较多,我们无法一次性全部列出,因此可以使用for循环来遍历。实际上,这道题并没有给出一棵真正的树,这棵树只是我们想象出来的。那么,我们如何确定何时到达叶子节点呢?实际上很简单,如果有n个数字,那么叶子节点的字符串长度就应该为n。

DFS思路:

        对于树的遍历,除了广度优先搜索(BFS)之外,我们还可以使用深度优先搜索(DFS)。在这里,我们可以将其视为树的前序遍历。网上有人称这种算法为回溯算法,但实际上,在这里回溯时并不需要撤销选择,因为每次生成字符串时都会创建一个新的对象,因此不会对其他分支造成污染。

三、代码实现

BFS方式代码:

#include <iostream>
#include <vector>
#include <string>
#include <queue>using namespace std;vector<string> letterCombinations(string digits) {vector<string> res;// 空判断if (digits.empty())return res;char tab[8][4] = {{'a', 'b', 'c', '\0'}, {'d', 'e', 'f', '\0'}, {'g', 'h', 'i', '\0'},{'j', 'k', 'l', '\0'}, {'m', 'n', 'o', '\0'}, {'p', 'q', 'r', 's'},{'t', 'u', 'v', '\0'}, {'w', 'x', 'y', 'z'}};queue<string> q;q.push("");while (!q.empty()) {string current = q.front();q.pop();if (current.length() == digits.length()) {res.push_back(current);} else {char* chars = tab[digits[current.length()] - '2'];for (int i = 0; chars[i] != '\0'; i++) {q.push(current + chars[i]);}}}return res;
}int main() {string digits = "23";vector<string> result = letterCombinations(digits);cout << "Letter combinations for " << digits << " are:" << endl;for (const string& combination : result) {cout << combination << " ";}cout << endl;return 0;
}

DFS方式代码:

#include <iostream>
#include <vector>
#include <string>using namespace std;void dfs(vector<string>& res, int index, const string& digits, const char tab[8][4], string path) {// 到叶子节点了,就把这条路径选择的字符添加到res中if (path.length() == digits.length()) {res.push_back(path);return;}char* chars = tab[digits[index] - '2'];// 访问当前节点的所有子节点for (int i = 0; chars[i] != '\0'; i++) {dfs(res, index + 1, digits, tab, path + chars[i]);// 因为字符串是创建了一个新的对象,所以这里不需要撤销}
}vector<string> letterCombinations(const string& digits) {vector<string> res;if (digits.empty())return res;char tab[8][4] = {{'a', 'b', 'c', '\0'}, {'d', 'e', 'f', '\0'}, {'g', 'h', 'i', '\0'},{'j', 'k', 'l', '\0'}, {'m', 'n', 'o', '\0'}, {'p', 'q', 'r', 's'},{'t', 'u', 'v', '\0'}, {'w', 'x', 'y', 'z'}};dfs(res, 0, digits, tab, "");return res;
}int main() {string digits = "23";vector<string> result = letterCombinations(digits);cout << "Letter combinations for " << digits << " are:" << endl;for (const string& combination : result) {cout << combination << " ";}cout << endl;return 0;
}

http://www.ppmy.cn/embedded/128554.html

相关文章

UML(Unified Modeling Language,统一建模语言)

UML&#xff08;Unified Modeling Language&#xff0c;统一建模语言&#xff09;是一种标准化的图形化语言&#xff0c;用于软件工程中的可视化建模。UML由Grady Booch、James Rumbaugh和Ivar Jacobson共同开发&#xff0c;他们各自的工作&#xff08;Booch方法、OMT方法和OOS…

使用 rbenv 安装 Ruby 2.7.5

如果尚未安装 rbenv&#xff0c;可以使用 Homebrew 安装它&#xff1a; brew install rbenv brew install ruby-build初始化 rbenv&#xff1a; rbenv init在终端中运行以下命令将 rbenv 添加到你的 shell 中&#xff1a; open .bash_profile复制代码到文件中 eval “$(rbenv…

elasticsearch 查询超10000,分页过大报错

查询数量过多会报&#xff1a; co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/search] failed: [search_phase_execution_exception] all shards failed 解决&#xff1a; PUT knowledge/_settings { "max_result_window" : 20000000 }

CEEMDAN +组合预测模型(BiLSTM-Attention + ARIMA)

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享&#xff01; EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现&#xff08;一&#xff09;EMD-CSDN博客 EMD、EEM…

服务器shell创建非root用户

在Linux服务器上创建一个非root用户是一个常见的安全实践。以下是如何在shell中创建非root用户的步骤: 愿我们终有重逢之时,而你还记得我们曾经讨论的话题。 QQ group 868373192 QQ second group 277356808 ### 1. 使用root用户登录或切换到root用户 如果你当前不是root用…

32.数据结构与算法-树表的查找-平衡二叉树的分析与调整

平衡二叉树的定义 失衡二叉排序树的分析与调整 平衡调整的四种类型 LL型调整 RR型调整 LR型调整 RL型调整 例题

Xcode报错:Undefined symbols,Linker command failed with exit code1

这种编译报错点击Xcode左侧的小红叉这两行点击没反应&#xff0c;不知道具体报错原因怎么弄&#xff1f; 解决办法&#xff1a; 第一步&#xff1a;点周Xcode左侧工具栏的编译log日志按钮 第二步&#xff1a;第一步点击完Xcode左侧出现了编译历史列表&#xff0c;可以看到有报…

Zilliz获Forrester报告全球第一;OB支持向量能力;Azure发布DiskANN;阿里云PG发布内置分析引擎

重要更新 1. Azure发布PostgreSQL向量索引扩展DiskANN&#xff0c;声称在构建HNSW/IVFFlat索引上&#xff0c;速度、精准度都超越pg_vector&#xff0c;并解决了pg_vector长期存在的偶发性返回错误结果的问题( [1] )。 2. 阿里云RDS PostgreSQL 发布AP加速引擎&#xff08;rds…