17. Letter Combinations of a Phone Number
1. Description
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent. Return the answer in any order.
A mapping of digits to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.![]()
2. Example
Example 1
Input: digits = “23”
Output: [“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
Example 2
Input: digits = “2”
Output: [“a”,“b”,“c”]
3. Constraints
- 0 <= digits.length <= 4
- digits[i] is a digit in the range [‘2’, ‘9’].
4. Solutions
Backtracking
m is the number of digits that map to 3 letters, n is the number of digits that map to 4 letters
Time complexity: O($3^m4^n$)
Space complexity: O(m + n)
class Solution {
public:
vector<string> letterCombinations(const string &digits) {
vector<string> combinations;
string combination;
combine_letters(digits, 0, combination, combinations);
return combinations;
}
private:
unordered_map<char, vector<char>> digit_letters{
{'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'}}};
void combine_letters(
const string &digits,
int index,
string &combination,
vector<string> &combinations) {
if (index == digits.size()) {
combinations.push_back(combination);
} else {
for (char letter : digit_letters[digits[index]]) {
combination.push_back(letter);
combine_letters(digits, index + 1, combination, combinations);
combination.pop_back();
}
}
}
};