@LeetCode电话号码的字母组合--Letter Combinations of a Phone Number[C++]
问题描述
给定一个包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
数字 | 字母 | 数字 | 字母 | 数字 | 字母 |
---|---|---|---|---|---|
1 | 2 | abc | 3 | def | |
4 | ghi | 5 | jkl | 6 | mno |
7 | pqrs | 8 | tuv | 9 | wxyz |
示例:
输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].
解决方法及复杂度分析
思路
基本的路线是遍历森林,每棵树是由输入字符串中第一个数字所映射的字母为根结点,依次以剩下数字所映射的字母为子树构成。
这里,我们灵活运用 队列 queue 这一数据结构。先将第一个数组所映射的所有字母压入队列,然后依次取出,按顺序依次与之后数字所映射的所有字母组合,并压入队列中。利用队列先入先出的性质,我们完成了所有字母的组合。
以输入 “23” 为例,算法流程如下图所示。
程序实现
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> words {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
if (digits.empty()) return vector<stirng> {};
queue<string> res;
res.push("");
for (int i = 0; i < digits.size(); i++) {
int len = res.size();
for (int j = 0; j < leng; j++) {
string tmp = res.front();
res.pop();
for (char x : words[digits[i] - '0']) {
res.push(tmp + x);
}
}
}
vector<stirng> ans;
while (!res.empty()) {
ans.push_back(res.front());
res.pop();
}
return ans;
}
};
@北京·怀柔 2019.3.4