Эта проблема называется «включением» или «подчинением» регулярных выражений, потому что вы запрашиваете, включает ли набор слов, сопоставленный одному регулярному выражению, (или включает в себя) набор слов, сопоставленных другим регулярным выражением. Равенство - это другой вопрос, который обычно означает, совпадают ли два регулярных выражения с одинаковыми словами, т. Е. Что они функционально эквивалентны. Например, «а *» включает в себя «аа *», в то время как они не равны.
Все известные алгоритмы включения в регулярное выражение - это наихудший случай, когда экспоненциальное время занимает величину регулярного выражения. Но стандартный алгоритм выглядит так:
Ввод r1 и r2
Выведите Да, если r1 включает в себя r2
- Создание DFA (r1) и DFA (r2)
- Создать Neg (DFA (r1)) (что в точности совпадает с теми словами, которые не соответствуют r1)
- Создать Neg (DFA (r1)) x DFA (r2) (что в точности совпадает с теми словами, которые соответствуют Neg (DFA (r1)) и DFA (r2))
- Убедитесь, что автомат, созданный в 3., не соответствует ни одному слову
Это работает, поскольку вы проверяете, что нет слов, соответствующих r2, которые не соответствуют r1.