题目描述(Medium)
Given a string containing digits from 2-9
inclusive, return all possible letter combinations that the number could represent.
A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.
Note:
Although the above answer is in lexicographical order, your answer could be in any order you want.
题目链接
https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/
Example 1:
Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
算法分析
方法一:dfs,传入digit的索引;
方法二:迭代,复制上一段序列,将下一字符序列,依次加入其中。
提交代码(方法一):
class Solution {
public:
const vector keyboard {
" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
vector letterCombinations(string digits) {
vector result;
if (digits.empty()) return result;
dfs(digits, 0, "", result);
return result;
}
void dfs(string &digits, int cur, string path, vector& result) {
if (path.size() == digits.size())
{
result.push_back(path);
return;
}
for (auto c : keyboard[digits[cur] - '0'])
dfs(digits, cur + 1, path + c, result);
}
};
提交代码(方法二):
class Solution {
public:
vector letterCombinations(string digits) {
if (digits.empty()) return vector();
const vector keyboard = {
"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
vector result(1, "");
for(auto c : digits)
{
string alpha = keyboard[c - '0'];
const int n = result.size();
const int m = alpha.size();
result.resize(m * n);
for (int i = 0; i < m; ++i)
copy(result.begin(), result.begin() + n, result.begin() + n * i);
for (int i = 0; i < m; ++i)
for_each(result.begin() + n * i, result.begin() + n * (i + 1), [&](string &str) {
str += keyboard[c - '0'][i];
});
}
return result;
}
};