17-letter-combinations-of-a-phone-number

Try it on leetcode

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 digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.

 

Example 1:

Input: digits = "23"
Output: ["ad","ae","af","bd","be","bf","cd","ce","cf"]

Example 2:

Input: digits = ""
Output: []

Example 3:

Input: digits = "2"
Output: ["a","b","c"]

 

Constraints:

  • 0 <= digits.length <= 4
  • digits[i] is a digit in the range ['2', '9'].

Solution(Python)

class Solution:
    def __init__(self):
        self.hashTable = {
            "2": "abc",
            "3": "def",
            "4": "ghi",
            "5": "jkl",
            "6": "mno",
            "7": "pqrs",
            "8": "tuv",
            "9": "wxyz",
        }
        self.hashList = [
            "0",
            "1",
            "abc",
            "def",
            "ghi",
            "jkl",
            "mno",
            "pqrs",
            "tuv",
            "wxyz",
        ]

    def letterCombinations(self, digits: str) -> List[str]:
        return self.dfs(digits)

    # Time Complexity: O(4^n)
    # Space Complexity: O(4^n)
    def bfs(self, digits: str) -> List[str]:
        n = len(digits)
        if n == 0:
            return []
        res = []
        queue = deque([""])

        while queue:
            s = queue.popleft()

            if len(s) == n:
                res.append(s)
            else:
                for letter in self.hashList[int(digits[len(s)])]:
                    queue.append(s + letter)

        return res

    # Time Complexity: O(4^n*n)
    # Space Complexity: O(n)
    def dfs(self, digits: str) -> List[str]:
        n = len(digits)
        if n == 0:
            return []
        res = []

        def backtrack(candidate, i):
            if len(candidate) == n:
                res.append(candidate)
                return
            for j in range(i, n):
                for code in self.hashTable[digits[j]]:
                    candidate += code
                    backtrack(candidate, j + 1)
                    candidate = candidate[:-1]

        backtrack("", 0)
        return res