Даны a и буква x, Найти максимальное К такое, что в L есть слова, заканчивающиеся на x^К
- Проверить выражение на валидность
- Состоит из символов a,b,c,1,+,*,.
- В случае возникновения несостыковок в дальнейшем алгоритм также возвращает ошибку(Например остался лишний символ, не конкатенированный к основной части)
- Перевести выражение в Token'ы
- Токены имеют тип:
- Операнд(бинарный или унарный в случае * )
- НКА Автомат, представленный в виде графа, где вершины – состояния, а ребра – однобуквенные переходы либо эпсилон переходы
- Любой символ X из a,b,c,1 переходит в автомат вида o---X--->o
- Приведение всех токенов в один НКА
- Приведение происходит с с использованием стека(оптимальный вариант для обратной польской записи)
- Конкатинация(AB.)
- Из всех терминальных состояний А добавляется эпсилон переход в начальное состояние B
- Все терминальные состаяния А перестают таковыми быть
- Терминальным состояниям A присваивается список терманальных состояний B
- В итоге получается модифицированный автомат A, по факту являющийся AB.
- Звезда(Клини*)
- Добавляется новое состояние, из него эпислон переход в старое начальное, новое состояние становится начальным
- Добавляются эпсилон переходы из всех терминальных состояний в новое начальное
- Терминальное состояние одно - новое начальное состояние
- Cложение? (AB+)
- Создается новое состояние x
- добавляются эпсилон переходы из x в начальные состояния A и B
- Начальным состоянием А делается X
- К терминальным состояниям A добавляются терминальные состояния B
- Так же как и с конкатинацией, все изменения остаются в А
- После завершения операции результат добавляется на вершину стека
- Поиск ответа на задачу производится при помощи рекуривного DFS из всех терминальных состояний в направлении, обратном обычному направлению переходов исключительно по ребрам, обозначенным необходимой буквой или эпсилон
- Ведется список посещенных вершин для предотвращения бесконечных циклов. Также, если мы уже имеем хотя бы один не эпсилон переход в истории и натыкаемся на вершину, в которой мы уже были, то это означает наличие бесконечного цикла и на экран выводится INF
- В случае отсутствия бесконечных циклов на экран выводится максимальная глубина, на которую удалось пройти без учета пройденных эпсилон переходов
class Vertex: # Вершина графа
def addTo(self,letter,vrtx): # добавление связи с другой вершиной
def goBackWithLetter(self,let, depth, beento): # рекурсивный обход против направления ребер
class AutomatEntry: # Класс НКА
def __init__(self, letter): # Задаестя начальное состояние, список конечных состояний. После выполнения этого метода НКА имеет вид o---letter--->o
def concat(self, am): # конкатинация с другим автоматом
def plus(self,am): # Сложение с другим автоматом
def star(self): # Звезда клини над этим автоматом
class Token: # Класс токена для удобства лексического разбора строки
def __init__(self,let):
class mRegex: # Главный класс для работы с регулярными выражениями
def __init__(self,expression): # Инициализация по выражению
def prepareRE(self): # Первоначальная проверка на валидность, удаление пробельных символов
def tokenize(self): # Перевод символов в токены
def generateAutomat(self): # Генерация одного автомата из всех токенов
def getMaxLen(self,letter): # Поиск ответа на поставленную задачу при помощи описанного выше алгоритма