如果大家有任何不明白的,直接评论就好啦。可以留自己的邮箱,这样可以方便直接回复,嘿嘿嘿


电话号码的字母组合

题目描述

给定一个仅包含数字 $2-9$ 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 $1$ 不对应任何字母。

数据样例

示例 1

1
2
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2

1
2
输入:digits = ""
输出:[]

示例 3

1
2
输入:digits = "2"
输出:["a","b","c"]

提示:

  • $0 \leq digits.length \leq 4$
  • digits[i] 是范围 ['2', '9'] 的一个数字。

深度优先搜索 DFS - $O(4 ^ N)$

深度优先搜索 DFS

由于题目的 数据范围很小($N$ 很小,每个按键上的数字很少),因此可以直接暴力搜索。

DFS 搜索过程:

  • 枚举 digits 数组中的所有按钮
  • 对于当前按钮而言,枚举对应按钮上的所有字符

为了帮助大家理解 DFS 的搜索过程,下述绘制了 DFS 搜索空间树

  • DFS 是对下述树的一个前序遍历的过程

DFS 搜索空间树如下图所示:

  • 每个节点存储的是当前搜索的信息,其中 string 是当前已经选择的字符构成的字符串
  • 每条边对应每次搜索过程中选择按钮上的哪个字符

DFS 搜索代码可能不容易写,具体大家可以结合代码和上述空间树来一起理解 DFS 的过程。

时间复杂度 - $O(4 ^ N)$

  • 由于每个按钮上最多有 $4$ 个字符,对应上面图中树的每个点的出边最多 $4$ 条
  • digits 数组长度为 $N$,因此树一共最多 $N$ 层

因此时间复杂度为:$O(4 ^ N)$

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
func letterCombinations(digits string) []string {
res = []string{}
dfs(digits, 0, "")
return res
}

var res []string

// 记录所有按钮上的所有字符
var numbers map[byte]string = map[byte]string{
'2': "abc",
'3': "def",
'4': "ghi",
'5': "jkl",
'6': "mno",
'7': "pqrs",
'8': "tuv",
'9': "wxyz",
}

// DFS搜索:参数和上面图中对应
// digits是题目所给数组,u: 当前枚举的层数(对应枚举digits数组的第u个字符),cur:记录当前得到的字符串(对应图中的string: "")
func dfs(digits string, u int, cur string) {
// 当枚举到digits数组结尾的时候,结束搜索
if u >= len(digits) {
// 如果得到的字符串不为空则加入到答案数组中
if len(cur) > 0 { res = append(res, cur) }
return
}
// 枚举对应按钮上的所有的字符,对应图中的每一层到下一层的边
for _, c := range numbers[digits[u]] { dfs(digits, u + 1, cur + string(c)) }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
map<char, string> numbers = {
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"},
};

vector<string> res;

void dfs(string& digits, int u, string cur) {
if (u >= digits.size()) {
if (cur.size() > 0) res.push_back(cur);
return ;
}
for (auto& c : numbers[digits[u]]) dfs(digits, u + 1, cur + c);
}

vector<string> letterCombinations(string digits) {
dfs(digits, 0, "");
return res;
}
};