Учитывая текст txt [0..n-1] и шаблон pat [0..m-1], напишите функцию поиска (char pat [], char txt []), которая печатает все вхождения pat [] и его перестановки (или анаграммы) в txt []. Вы можете предположить, что n> m.
Ожидаемая сложность времени O (n)
Примеры:
1) Input: txt[] = "BACDGABCDA" pat[] = "ABCD" Output: Found at Index 0 Found at Index 5 Found at Index 6 2) Input: txt[] = "AAABABAA" pat[] = "AABA" Output: Found at Index 0 Found at Index 1 Found at Index 4
Мы настоятельно рекомендуем вам нажать здесь и попрактиковаться, прежде чем переходить к решению.
Эта проблема немного отличается от стандартной задачи поиска по шаблону, здесь мы также должны искать анаграммы. Поэтому мы не можем напрямую применять стандартные алгоритмы поиска шаблонов, такие как KMP , Рабин Карп , Бойер Мур и т. Д.
Простая идея — модифицировать алгоритм Рабина Карпа . Например, мы можем сохранить значение хеш-функции как сумму значений ASCII всех символов по модулю большого простого числа. Для каждого символа текста мы можем добавить текущий символ к значению хеша и вычесть первый символ предыдущего окна. Это решение выглядит хорошо, но, как и в случае со стандартным Рабином Карпом, временная сложность этого решения в наихудшем случае — O (mn). Наихудший случай возникает, когда все значения хеш-функции совпадают, и мы одно за другим сопоставляем все символы.
Мы можем достичь O (n) временной сложности, предполагая, что размер алфавита фиксирован, что, как правило, верно, поскольку у нас есть максимально 256 возможных символов в ASCII. Идея состоит в том, чтобы использовать два массива счета:
1) Первый массив подсчета хранит частоты символов в шаблоне.
2) Второй массив подсчета хранит частоты символов в текущем окне текста.
Важно отметить, что временная сложность сравнения двух массивов счетчиков равна O (1), поскольку количество элементов в них фиксировано (независимо от размера рисунка и текста). Ниже приведены шаги этого алгоритма.
1) Сохранение подсчетов частот паттерна в первом массиве countP [] . Также храните подсчеты частот символов в первом окне текста в массиве countTW [] .
2) Теперь запустите цикл от i = M до N-1. Делайте следующее в цикле.
… ..A) Если два массива подсчета идентичны, мы нашли случай.
… ..B) Увеличение счетчика текущего символа текста в countTW []
… ..C) Уменьшить счетчик первого символа в предыдущем окне в countWT []
3) Последнее окно не проверяется вышеуказанным циклом, поэтому проверьте его явно.
Ниже приведена реализация вышеуказанного алгоритма.
|
Джава
|
python3
|
C #
|
Выход:
Found at Index 0 Found at Index 5 Found at Index 6
Эта статья предоставлена Пиюшем Гуптой . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- is_permutation () в C ++ и его применение для поиска анаграмм
- Двоичное дерево поиска | Набор 1 (поиск и вставка)
- Линейный поиск
- Разреженный поиск
- Sentinel Линейный Поиск
- Трие | (Вставить и найти)
- Поиск элемента в заданных N диапазонах
- Двоичное дерево поиска | Набор 2 (Удалить)
- Поиск слова в 2D сетке символов
- Сумма всех уровней в дереве бинарного поиска
- Элемент поиска в матрице со спиральной сортировкой
- Создать отсортированный массив с помощью бинарного поиска
- Inorder наследник в бинарном дереве поиска
- Поиск элемента в отсортированном и повернутом массиве
- Самый длинный общий префикс с использованием бинарного поиска
0.00 (0%) 0 votes