Пример решения задачи #10. Python LeetCode, Сопоставление регулярных выражений

Опубликовано: 13.12.2024, 13:11 | Автор: hdhAI

Вариант решения задачи на языке программирования Python с LeetCode.
Категория: Алгоритмы.
Название задачи: Сопоставление регулярных выражений.
Сложность: Сложная.
Статус решения: "Решено".

Условие задачи:
Учитывая входную строку s и шаблон p, реализовать сопоставление регулярных выражений с поддержкой '.' и '*' где:

'.' Соответствует любому отдельному символу.
'*' Соответствует нулю или предыдущему элементу.

Решение:


Python

class Solution(object):
    def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        # Создаем двумерный массив для хранения результатов подзадач
        # dp[i][j] будет True, если первые i символов строки s совпадают с первыми j символами шаблона p
        dp = [[False] * (len(p) + 1) for _ in range(len(s) + 1)]

        # Пустая строка совпадает с пустым шаблоном
        dp[0][0] = True

        # Заполняем случай, когда шаблон содержит '*', который может соответствовать пустой строке
        for j in range(1, len(p) + 1):
            if p[j - 1] == '*':
                dp[0][j] = dp[0][j - 2]

        # Заполняем таблицу dp
        for i in range(1, len(s) + 1):
            for j in range(1, len(p) + 1):
                if p[j - 1] == '.' or p[j - 1] == s[i - 1]:
                    # Символы совпадают или шаблон содержит '.'
                    dp[i][j] = dp[i - 1][j - 1]
                elif p[j - 1] == '*':
                    # '*' может соответствовать нулю или более символам предыдущего элемента
                    dp[i][j] = dp[i][j - 2] or (dp[i - 1][j] and (p[j - 2] == s[i - 1] or p[j - 2] == '.'))

        # Возвращаем результат для всей строки и всего шаблона
        return dp[len(s)][len(p)]

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


Инициализация таблицы dp:
Создается двумерный массив dp размером (len(s)+1) x (len(p)+1). Каждая ячейка dp[i][j] представляет, совпадают ли первые i символов строки s с первыми j символами шаблона p.
dp[0][0] = True, так как пустая строка совпадает с пустым шаблоном.

Обработка шаблона с '' для пустой строки: Если символ шаблона равен '', он может соответствовать нулю вхождений предыдущего элемента. Это проверяется выражением dp[0][j] = dp[0][j-2].

Основная логика заполнения таблицы:
Если текущий символ шаблона p[j-1] равен '.' или совпадает с символом строки s[i-1], то dp[i][j] = dp[i-1][j-1].

Если текущий символ шаблона p[j-1] равен '*', возможны два случая:

1) '*' соответствует нулю вхождений предыдущего элемента: dp[i][j] = dp[i][j-2].

2) '*' соответствует одному или более вхождений предыдущего элемента: dp[i][j] = dp[i-1][j], если предыдущий символ шаблона (p[j-2]) равен текущему символу строки (s[i-1]) или равен '.'.

Результат:
Значение в ячейке dp[len(s)][len(p)] указывает, совпадают ли вся строка s и шаблон p.

Пример использования:
solution = Solution()
print(solution.isMatch("aa", "a")) # Ожидаемый результат: False
print(solution.isMatch("aa", "a")) # Ожидаемый результат: True print(solution.isMatch("ab", ".")) # Ожидаемый результат: True

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

Похожие статьи
Интересное





Warning: file_put_contents(/var/www/angella1/data/www/hdhai.com/counter/count.php): Failed to open stream: Permission denied in /var/www/angella1/data/www/hdhai.com/counter.php on line 89