Новости IT, Tech-лайфхаки & Кодинг

Решение задачи #17. Python LeetCode, Letter Combinations of a Phone Number

Опубликовано: 03.05.2025, 16:45 | Автор: HDHai

Вариант решения задачи на Python с LeetCode

Категория: Алгоритмы.
Название задачи: Python LeetCode, Letter Combinations of a Phone Number.
Сложность: Средняя.
Статус решения: "Решено".

Задача относится к алгоритмическим задачам на комбинаторику и рекурсивный перебор (backtracking).

Условие задачи:
Дана строка, содержащая цифры от 2 до 9 включительно. Нужно вернуть все возможные буквенные комбинации, которые могут быть представлены этим числом, согласно стандартному сопоставлению цифр и букв на кнопках телефона. Ответ можно вернуть в любом порядке.

Решение:


Python

class Solution(object):
    def letterCombinations(self, digits):
        """
        Функция возвращает все возможные комбинации букв, соответствующие цифрам на телефонной клавиатуре.
        
        :type digits: str - входная строка с цифрами от 2 до 9
        :rtype: List[str] - список строк с комбинациями букв
        """
        
        # Проверяем пустой ввод
        if not digits:
            return []
        
        # Создаем словарь соответствия цифр буквам
        digit_map = {
            '2': 'abc',
            '3': 'def',
            '4': 'ghi',
            '5': 'jkl',
            '6': 'mno',
            '7': 'pqrs',
            '8': 'tuv',
            '9': 'wxyz'
        }
        
        # Инициализируем список для хранения результатов
        result = []
        
        # Рекурсивная функция для генерации комбинаций
        def backtrack(index, current_str):
            """
            Вспомогательная функция для рекурсивного перебора комбинаций.
            
            :param index: int - текущий индекс в строке digits
            :param current_str: str - текущая формируемая строка
            """
            # Если достигли конца цифр, добавляем комбинацию в результат
            if index == len(digits):
                result.append(current_str)
                return
            
            # Получаем текущую цифру и соответствующие ей буквы
            current_digit = digits[index]
            letters = digit_map[current_digit]
            
            # Перебираем все буквы и рекурсивно вызываем функцию для следующей цифры
            for letter in letters:
                backtrack(index + 1, current_str + letter)
        
        # Запускаем рекурсию с начальными параметрами
        backtrack(0, "")
        
        return result

Объяснение кода


Проверка ввода:
Сначала проверяем, не пустая ли строка digits. Если пустая - сразу возвращаем пустой список.

Словарь соответствий:
Создаем словарь digit_map, где каждой цифре от 2 до 9 соответствуют буквы, как на телефонной клавиатуре:

2: abc
3: def
4: ghi
5: jkl
6: mno
7: pqrs
8: tuv
9: wxyz

Рекурсивная функция backtrack:

Базовый случай:
Когда индекс достигает длины строки digits, текущая комбинация добавляется в результат.

Рекурсивный случай:
Для текущей цифры берем все соответствующие буквы и для каждой буквы рекурсивно вызываем функцию для следующей цифры, добавляя текущую букву к строке.

Запуск рекурсии:
Начинаем процесс с индекса 0 и пустой строки.

Возврат результата:
После завершения всех рекурсивных вызовов возвращаем накопленный результат.

Пример использования:


Python

sol = Solution()
print(sol.letterCombinations("23")) 
# Вывод: ['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf']

Особенности решения

Используется метод backtracking (возврат с проверкой)

Временная сложность:
O(3^N × 4^M), где N - количество цифр с 3 буквами, M - с 4 буквами

Пространственная сложность:
O(N) для хранения рекурсивного стека вызовов

Решение соответствует стилю задач LeetCode с использованием класса Solution и эффективно перебирает все возможные комбинации, используя рекурсию, является классическим подходом к подобным задачам на комбинаторику.

Мы рассмотрели пример решения, который был принят и засчитан платформой как правильный, но вы можете найти свой способ решения задачи, возможно лучше.

Источник решения: hdhai.com