题目描述
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
1 2
| 输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
|
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
题解
回溯算法
遍历每个数字所有的可能性,如果进行到最后一个数字,则将结果放入数组中。
复杂度
- 时间复杂度:,
N
为对应有 3 个字符的数字(例如:2, 3, 4, 5, 6, 8
)的个数,M
为对应有 4 个字符的数字(例如:7, 9
)的个数,N+M
为输入的所有数字数目。
- 空间复杂度:,因为结果有 种。
代码
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
| vector<string> letterCombinations(string digits) { vector<string> ret; if (digits.length() == 0) { return ret; } backtrack(digits, 0, "", ret); return ret; } void backtrack(string& digits, int level, string s, vector<string>& ret) { if (level == digits.length()) { ret.push_back(s); return; } auto charString = getCharString(digits[level] - '0'); for (auto ch : charString) { backtrack(digits, level + 1, s + ch, ret); } } string getCharString(int n) { if (n < 2 || n > 9) { return "*"; } int idx = n - 2; vector<string> map = { "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", }; return map[idx]; }
|
参考链接