@n1ksON
мидл

Как написать свое регулярное выражение?

Необходимо обработать символ *, который означает, что предыдущий символ встречается 0 или более раз.
Дается какая-то строка, например, s="a*b*a". Это означает, что эта строка эквивалентна: a, aa, ba, aba, aaa, bbb, и тд. С парсингом строки s в целом вопросов нет, я разбиваю ее на массив символов и массивом чисел, который характеризует символы. В данном случае:
['a', 'b', 'a'];
[1, 1, 0];
То есть первые 'a' и 'b' являются необычными символами, последний 'a' является обычным.

И теперь вопрос, как проверить на равенство эту строку с другими?
Самая большая проблема возникает, когда для указанного выше s, поступает на проверку строка: "a". Как алгоритм должен понимать, что эта 'a' подходит только к обычному символу 'a' из s. Если я последовательно начну проверять и сперва сверю с необычным 'a', то потом для обычного 'a' символов во входной строке уже не останется и алгоритм решит, что строка неправильная.

Аналогичная задача есть со спец символом ?.
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Без теории тут никак.
Тут 2 варианта: или стройте конечный недетерменированный автомат (с эпсилон переходами), который соответствует этому регулярному выражению и дальше применяйте стандартный алгоритм проверки. что автомат принимает заданную строку. Или второй вариант: пишите динамическое программирование "соответствует ли вот этот префикс заданной строки вот этому префиксу регулярного выражения".

Конечный автомат будет и побыстрее работать и памяти меньше требовать.

upd: ну и, конечно, тут полным перебором рекурсивно можно сделать. Но это будет гораздо медленнее любого из указанных выше методов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы