零、原题链接
一、题目描述
给定一个仅包含数字 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'] 的一个数字。
三、解题思路
- 基本思路:
采用回溯法,在这题其实就是深度遍历所有数字对应的字母。 - 具体思路:
- 预处理:
- 建立数字到字符的映射关系
dight2str。
- 建立数字到字符的映射关系
- 深度遍历:
- 判断是否为最后一个数字,如果是,则将当前字符串存储到
ans中并返回。 - 递归遍历该数字对应的所有字母。
- 判断是否为最后一个数字,如果是,则将当前字符串存储到
- 返回结果
ans
- 预处理:
四、参考代码
时间复杂度:
O
(
4
n
)
\Omicron(4^n)
O(4n)【最坏情况下,共计 n 个数字,每层遍历 4 个字母】
空间复杂度:
O
(
n
)
\Omicron(n)
O(n)【递归栈的深度】
class Solution {
public:
string m_digits;
vector<string> dight2str = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector<string> ans;
void dfs(const int& i, const string& str) {
if (i == m_digits.length()) {
ans.emplace_back(str);
return;
}
const auto s = dight2str[m_digits[i] - '2'];
for (int j = 0; j < s.length(); j++) {
dfs(i + 1, str + s[j]);
}
}
vector<string> letterCombinations(string digits) {
if (digits.length() == 0)
return {};
m_digits = digits;
dfs(0, "");
return ans;
}
};
862

被折叠的 条评论
为什么被折叠?



