电话号码的字母组合
🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
一、题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。数字和字母的对应关系,如下图所示:
例如:数字 2 对应字母 abc 三个字符。
题目类型:回溯/深度优先搜索。
二、题目样例
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
说明:2 对应 abc,3 对应 def ,组合后即为上述结果。
三、解题思路
本题求解的是数字对应字母的所有组合,可以用回溯法遍历所有的情况(或者说是深度优先搜索遍历所有情况),遍历的过程中不断的收集符合的组合,最后统一返回。
四、代码实现
4.1 头文件
#include <iostream>
#include <vector>
#include <map>
using namespace std;
4.2 代码
class Solution {
public:
vector<string> letterCombinations(string digits) {
// 字符串为空
if(digits == "") return {};
// 设置对应关系
map<char, string> number{
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
vector<string> allCom;
findCombination(digits, 0, "", number, allCom);
return allCom;
}
// 递归找出所有组合
void findCombination(string digits, int num, string ans, map<char, string> number, vector<string>&allCom) {
// 遍历完最后一个数字
if(num >= digits.size()) {
allCom.push_back(ans);
return ;
}
// 依次选择每一个元素
string strNum = number[digits[num]];
for(int i = 0; i < strNum.size(); ++i) {
findCombination(digits, num+1, ans + strNum[i], number, allCom);
}
return;
}
};
五、复杂度分析
5.1 时间复杂度
时间复杂度:约为 O(3^n),n 为输入字符串的长度, 3 代表一个数字对应的字母的个数(虽然有的是 4,这里统一使用 3),所以时间复杂度约为 O(3^n)。
5.2 空间复杂度
空间复杂度:O(m + n),包括两部分,一部分是设置数字和字母关系的 map(设为 m),另一个是递归的的深度(设 n 为输入的字符串的长度),递归的深度为 n,所以总的空间复杂度为 O(m + n)。
六、题目链接
力扣
CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
欢迎小伙伴们点赞👍、收藏⭐、留言💬
- 点赞
- 收藏
- 关注作者
评论(0)