cpp: add «17. Letter Combinations of a Phone Number»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
16283b93e8
commit
4299b5f85a
1 changed files with 57 additions and 0 deletions
57
cpp/letter-combinations-of-a-phone-number.cpp
Normal file
57
cpp/letter-combinations-of-a-phone-number.cpp
Normal file
|
@ -0,0 +1,57 @@
|
|||
#include <array>
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
struct Solution {
|
||||
std::vector<std::string> letterCombinations(const std::string &digits) {
|
||||
solver s(digits);
|
||||
s.solve();
|
||||
return s.combinations;
|
||||
}
|
||||
|
||||
private:
|
||||
struct solver {
|
||||
const std::string &digits;
|
||||
std::vector<std::string> combinations;
|
||||
|
||||
solver(const std::string &digits) : digits(digits) {}
|
||||
void solve() {
|
||||
std::string s;
|
||||
solve(s, 0);
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<std::string, 8> LETTERS{"abc", "def", "ghi", "jkl",
|
||||
"mno", "pqrs", "tuv", "wxyz"};
|
||||
|
||||
void solve(std::string &s, int i) {
|
||||
if (i < 0 || i >= static_cast<int>(digits.size())) {
|
||||
if (!s.empty()) {
|
||||
combinations.emplace_back(s);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
for (char c : LETTERS[digits[i] - '2']) {
|
||||
s.push_back(c);
|
||||
solve(s, i + 1);
|
||||
s.pop_back();
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
int main() {
|
||||
Solution s;
|
||||
|
||||
assert((s.letterCombinations("23") ==
|
||||
std::vector<std::string>{"ad", "ae", "af", "bd", "be", "bf", "cd",
|
||||
"ce", "cf"}));
|
||||
assert((s.letterCombinations("") == std::vector<std::string>{}));
|
||||
assert(
|
||||
(s.letterCombinations("2") == std::vector<std::string>{"a", "b", "c"}));
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue