@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' символов во входной строке уже не останется и алгоритм решит, что строка неправильная.

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

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

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

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

Войти через центр авторизации
Похожие вопросы