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.

Solution

This is a simple backtracking problem.

Base case: If our starting index is the length of our digits, we have reached a leaf node (solution) and append this to our list of results.

Recursion: Find the current number based on its index, then traverse through all the of its possible characters and recurse.

class Solution:
    
    KEYBOARD = {
        '2': 'abc',
        '3': 'def',
        '4': 'ghi',
        '5': 'jkl',
        '6': 'mno',
        '7': 'pqrs',
        '8': 'tuv',
        '9': 'wxyz',
    }
    
    def letterCombinations(self, digits: str) -> List[str]:
        
        def dfs(start_index, path):
            if start_index == len(digits):
                result.append(''.join(path))
                return
            
            current_num = digits[start_index]
            for letter in self.KEYBOARD[current_num]:
                path.append(letter)
                dfs(start_index + 1, path)
                path.pop()
            
            
        result = []
        if digits:
            dfs(0, [])
        return result