Припустимо, нам колекцію з рядків, . Я хотів би знати, чи будь-який з цих рядків є підрядком будь-якого іншого рядка в колекції. Іншими словами, я хотів би створити алгоритм для наступного завдання:
Введення:
Вихід: такий, що є підрядком і , або None, якщо таких існує
Чи існує ефективний алгоритм для цього?
Якщо замінити "підрядку" на "префікс", існує ефективний алгоритм (сортуйте рядки, потім зробіть лінійне сканування для порівняння сусідніх рядків; сортування забезпечить, щоб підрядки були суміжними). Але здається, складніше перевірити, чи будь-яка рядок є підрядком будь-якої іншої рядки. Наївний алгоритм полягає в перегляді всіх пар , але для цього потрібні тести підрядкових тестів . Чи є більш ефективний алгоритм?
Я думаю, що ми могли б назвати це "тестування підрядків на всі пари", або щось подібне.
Моя кінцева мета - обрізати колекцію, щоб жодна рядок не була підрядком будь-якої іншої, видаляючи кожну, яка є підрядкою чогось іншого в колекції.