#algorithm #string-matching #knuth-morris-pratt
#алгоритм #сопоставление строк #кнут-моррис-Пратт
Вопрос:
Как мне следует обращаться со случаем, когда сопоставляемый шаблон содержит подстановочный знак, *
, например , AB*C
, который присутствует в тексте ABEFGCS
(здесь *
используются символы EFG
), используя KMP-алгоритм?
Какая модификация в алгоритме может решить эту проблему?
Комментарии:
1.
*
жаден по натуре.. Я бы просто сопоставил AB в тексте, а затем C после AB.
Ответ №1:
На самом деле я понял, оставив ответ для справки, мы можем просто разбить строку об операторе подстановки, применить KMP к каждой части и проверить, является ли каждая часть вложенной строкой или нет, также, являются ли части смежными или нет, можно проверить за линейное время, следовательно, общее времясложность по-прежнему линейна.
Комментарии:
1. Мой анализ временной сложности при наличии
k
звездочки: разбейтеpattern
строку на большуюk 1
часть, выполните поиск по каждому подшаблону вtarget text
k 1
отсортированных индексах. Создайтеk
монотонный указатель, подобный которому в mergesort, это может найти все совпадения во времениO(km n)
и пространствеO(k n)
(например, в python combinenext
иyield
). Гдеm
— длинаtext
строки, n — длинаpattern
строки.