LeetCode刷题--- 电话号码的字母组合
2023-12-20 09:52:57
个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客
个人专栏
力扣递归算法题
【C++】? ? ? ? ?
数据结构与算法
前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的 ?
我讲述题目会把讲解部分分为3个部分:
1、题目解析
2、算法原理思路讲解
3、代码实现
电话号码的字母组合
题目链接:电话号码的字母组合
题目
给定一个仅包含数字?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']
?的一个数字。
解法
题目解析
题目的意思非常简单,给定一个仅包含数字?2-9
?的字符串,返回所有它能表示的字母组合。答案可以按?任意顺序?返回。给出了数字到字母的映射。
示例 1:
输入:digits = "23" 输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
算法原理思路讲解?
一、画出决策树
以"23"为例子
决策树就是我们后面设计函数的思路
二、设计代码
(1)全局变量
- 首先这里有映射,我们便可以创建一个 哈希表 phoneMap。记录 2~9 各?对应的字符。
- 一个数组 ret ,用来存储字母组合
- 一个 字符串 path,用来记录存储字母
unordered_map<char, string> phoneMap
{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
vector<string> ret;
string path;
(2)设计递归函数
void dfs(string digits,int pos)
- 参数:pos?(已经处理的元素个数)
- 返回值:?
- 函数作?:查找所有合理的字?组合并存储在答案列表中。
递归函数流程如下:
- 递归结束条件:当 pos?等于 digits 的?度时,将 path?加?到 ret?中并返回;
- 取出当前处理的数字 digit,根据 phoneMap 取出对应的字?列表 letters;
- 遍历字?列表 letters,将当前字?加?到组合字符串 path?的末尾,然后递归处理下?个数字(传入pos?+ 1,表?处理下?个数字);
- 递归处理结束后,将加?的字?从 path?的末尾删除,表?回溯。
- 最终返回 ret?即可。
以上思路讲解完毕,大家可以自己做一下了
?代码实现
- 时间复杂度:O(?*?),其中 m?是输入中对应 3?个字母的数字个数(包括数字 2、3、4、5、6、8),n?是输入中对应 4?个字母的数字个数(包括数字 7、9),m+n 是输入数字的总个数。当输入包含 m?个对应 3?个字母的数字和 n?个对应 4?个字母的数字时,不同的字母组合一共有种(?*?),需要遍历每一种字母组合。
- 空间复杂度:O(m+n),其中 m?是输入中对应 3?个字母的数字个数,n?是输入中对应 4?个字母的数字个数,m+n?是输入数字的总个数。除了返回值以外,空间复杂度主要取决于哈希表以及回溯过程中的递归调用层数,哈希表的大小与输入无关,可以看成常数,递归调用层数最大为 m+n。
class Solution
{
public:
unordered_map<char, string> phoneMap
{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
vector<string> ret;
string path;
void dfs(string digits,int pos)
{
if (pos == digits.size())
{
ret.push_back(path);
return ;
}
char digit = digits[pos];
const string& letters = phoneMap[digit];
for (int i = 0; i < letters.size(); i++)
{
path += letters[i];
dfs(digits,pos+1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits)
{
if (digits.empty())
{
return ret;;
}
dfs(digits,0);
return ret;
}
};
文章来源:https://blog.csdn.net/weixin_74268082/article/details/135098686
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!