casyup.me@outlook.com

0%

leetcode/17ZLetter_Combinations_of_a_phone_Number

Letter combinations of a phone number

给一个包含 2-9 整数的字符串, 返回所有可能的数字能代表的字母组合

my code

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
33
34
35
36
37
class Solution {
public:
vector<string> letterCombinations(string digits) {
if (digits.empty()) return {};

doit(digits, {});

return ret;
}

private:
void doit(string digits, string const& str) {
if (digits.size() == 0) {
ret.emplace_back(str);
return;
}

vector<char>& charset = dict[int(digits[0]) - 48];

for (int i = 0; i < charset.size(); ++i) {
doit({digits.begin() + 1, digits.end()}, str + charset[i]);
}
}

map<int, vector<char>> dict = {
{2, {'a', 'b', 'c'}},
{3, {'d', 'e', 'f'}},
{4, {'g', 'h', 'i'}},
{5, {'j', 'k', 'l'}},
{6, {'m', 'n', 'o'}},
{7, {'p', 'q', 'r', 's'}},
{8, {'t', 'u', 'v'}},
{9, {'w', 'x', 'y', 'z'}}
};

vector<string> ret;
};

简单地存储一个映射, 然后循环调用, 每次获取一个字符

因为循环深度不可控, 以及为了简单易懂, 所以选择了递归, 不过这会带来额外的栈帧

内存开销上会多不少, 速度上差别倒是不大

dalao’s code

简单看了一下, 是用 for 循环实现的

因为时间上并没有什么差距, 原理也很好懂, 这次就不具体贴出来了