Напишите программу для удаления фрагментов, встречающихся во" всех "строках, где фрагмент это 3 или более последовательных слова.
Пример:
Input ::
s1 = "Идет дождь, и я хочу ехать домой.";
s2 = "Идет дождь, и я хочу покататься на лыжах.";
s3 = "Жарко, и я хочу пойти поплавать.";
Вывод ::
s1 = "Идет дождь, ехать домой.";
s2 = "Идет дождь, катайтесь на лыжах.";
s3 = "Похоже, купаться.";
Удален фрагмент = "и я хочу"
Программа снова будет тестировать большие файлы. Будет учтена эффективность.
Допущения: Игнорировать заглавные буквы и знаки препинания. но сохранить на выходе.
Примечание: Позаботьтесь о случаях вроде
a a a a a b c b c b c b c, когда удаление приведет к созданию большего количества фрагментов.
Хешируйте трехсловные фразы в int и сохраняйте их в массиве для всех строк. сводится к массиву чисел вроде
1 2 3 4 5
3 5 7 9 8
9 3 1 7 9
Проблема сводится к пересечению массивов.
сортировать массивы. (k * nlogn)
сохранить k указателей. если все равно найдены совпадения. else увеличивает указатель, указывающий на наименьшее значение. Решить для примечания выше. Я думал о ленивом удалении, т.е.Отметьте фразы для удаления и удалите в конце.
Могут ли мои решения не сработать? Можем ли мы оптимизировать мое решение / найти лучшее решение?