Ця задача полягає у написанні коду для вирішення наступної проблеми.
Враховуючи два рядки A і B, ваш код повинен виводити початкові та кінцеві індекси підрядка A з такими властивостями.
- Підрядка A також повинна відповідати деякій підрядковій лінії B.
- Більше не повинно бути підрядків A, що задовольняє першому властивості.
Наприклад:
A = xxxappleyyyyyyy
B = zapplezzz
Підрядка apple
з індексами 4 8
(індексування від 1) буде дійсним результатом.
Функціональність
Ви можете припустити, що введення буде стандартним в або у файлі в локальному каталозі, це ваш вибір. Формат файлу буде просто двома рядками, розділеними новим рядком. Відповідь має бути повноцінною програмою, а не лише функцією.
Зрештою, я хотів би перевірити ваш код на двох підрядках, узятих із рядків у http://hgdownload.cse.ucsc.edu/goldenPath/hg38/chromosomes/ .
Оцінка
Це кодовий гольф із поворотом. Ваш код повинен бути запущений у O(n)
часі, де n
загальна довжина вводу.
Мови та бібліотеки
Ви можете використовувати будь-яку мову, у якій є доступний компілятор / перекладач / тощо. для Linux. Вам слід використовувати лише стандартні бібліотеки з відкритим кодом, не призначені для вирішення цього завдання. У разі суперечок я буду вважати це будь-якою бібліотекою, яка є стандартною для вашої мови, або бібліотекою, яку ви можете встановити на машину ubuntu за замовчуванням із сховища за замовчуванням.
Корисна інформація
Існує як мінімум два способи вирішити цю проблему за лінійним часом. Одне - спочатку обчислити дерево суфіксів, а друге - спочатку обчислити масив суфіксів та масив LCP.
- Ось повне і (можливо, завищене) детальне пояснення лінійної побудови дерева суфіксів часу (виявляється, деякі фігури, на жаль, переплутані). Також є дуже приємна відповідь щодо створення лінійного дерева суфіксів часу за посиланням https://stackoverflow.com/questions/9452701/ukkonens-suffix-tree-algorithm-in-plain-english . Він також містить посилання на вихідний код. Ще одне детальне пояснення можна знайти тут , цього разу даючи повне рішення у С.
- Розділ 2 http://www.cs.cmu.edu/~guyb/realworld/papersS04/KaSa03.pdf дає алгоритм побудови масиву лінійних суфіксів часу та додаток А містить вихідний код C ++. Ця відповідь розповідає, як тоді обчислити найдовшу загальну підрядку https://cs.stackexchange.com/questions/9555/computing-the-lolong-common-substring-of-two-strings-using-suffix-arrays . Розділ 5 https://courses.csail.mit.edu/6.851/spring12/scribe/lec16.pdf, у якому також є відповідна відео лекція https://courses.csail.mit.edu/6.851/spring12/lectures/L16 .html також пояснює той же алгоритм, починаючи з 1:16:00.
O(n) time
Ви впевнені, що це можливо?