Первое важное наблюдение заключается в том, что мы можем уменьшить проблему: если S разрешен и равен 1
или заканчивается двумя, то S, сцепленный с любой разрешенной последовательностью, остается разрешенным. Так что же делает действительный S?
1
явно в S, и любая последовательность из более чем одного 1
всегда будет заканчиваться 11
, как и в S.
- За
01
может следовать только другой 1
, так как 0
даст 010
. Это заканчивается на 11
, и поэтому является действительным S.
- A
00
может сопровождаться только 11
, поскольку 0000
, 0001
и 0010
все имеют чередующиеся нули. Это заканчивается на 11
, и поэтому является действительным S.
Так что это говорит нам о любых S совпадениях ^(1|011|0011)*$
. Но мы еще не закончили, поскольку есть несколько других последовательностей, которые недопустимы для S, но сами по себе являются допустимыми последовательностями и поэтому могут быть соединены с S.
000
, конечно, не допускается, и все, что больше, либо в S, либо само по себе не разрешено.
Таким образом, все регулярные выражения, соответствующие допустимым последовательностям:
^(1|011|0011)*(|0|00|01|001)$
Это ноль или более S последовательностей, за которыми может следовать одна из наших разрешенных не S последовательностей.