Если бы была просто цепочка состояний без петли, вы бы знали, что делать?
Если бы существовал простой цикл без этого перекрывающегося ветвления, знаете ли вы, что делать?
(Если ответ «нет», сначала подумайте об этих случаях.)
Теперь идея состоит в том, чтобы постепенно преобразовать автомат, чтобы привести его в форму, в которой вы сможете определить эти паттерны: цепочки, петли и расходящиеся пути, которые в конечном итоге сходятся (что приводит к чередованию). На каждом этапе преобразования следите за тем, чтобы преобразованный автомат все еще распознавал один и тот же язык.
Имейте в виду , что это не -deterministic автомат. Тот, который вы опубликовали, оказывается детерминированным, но он не должен оставаться таким, когда вы преобразуете его.
q2q1→fq2→gq3q4q2q5q4→jq5→gq3
q3,q4,q5q3q3(hjg)∗
Позаботьтесь, чтобы проверить, какие состояния являются окончательными. Это может помочь не беспокоиться об этом сначала и сделать один большой цикл, а затем дублировать части, которые заканчиваются частично в цикле.
Это не обязательно является наиболее эффективным методом, или тот, который генерирует простейшую регулярное выражение, но это просто.