Алгоритм Ландау-Вишкина (k несовпадений)
Постановка задачи
Дано число текст и образец , . Требуется найти все подстроки текста длины , с не более чем несовпадающими символами.
Основная идея
При анализе текста используется двумерный массив , содержащий информацию о несовпадениях текста с образцом. По завершении анализа в его -й строке содержатся позиции в первых несовпадений между строками и . Таким образом, если , то , и это -е несовпадение между и , считая слева направо. Если число несовпадений с подстрокой меньше , то, начиная с , элементы -й строки равны значению по умолчанию . То есть
Заметим, если , то подстрока отличается от образца не более, чем на символов, и, таким образом, является решением задачи.
//todo (рис 1)
Образец сканируется параллельно с текстом слева на права по одному символу за раз. На итерации с образцом сравнивается подстрока . - обозначим самую правую позицию в тексте, достигнутую за предыдущие итерации, то есть является максимальным из чисел , где //todo. Если , в присваивается результат работы , которая находит количество несовпадений между и . Если не превышает , вызывается процедура , которая сравнивает пары символов из подстрок увеличивается и таблица текстовых несовпадений обновляется. Если найдено несовпадений, обработка заканчивается, иначе найдено вхождение образца, начинающегося с .
Пример
Пусть , , .
//todo pm
