Questa sfida riguarda la scrittura di codice per risolvere il seguente problema.
Date due stringhe A e B, il codice dovrebbe generare gli indici iniziale e finale di una sottostringa di A con le seguenti proprietà.
- La sottostringa di A dovrebbe anche corrispondere ad una sottostringa di B.
- Non dovrebbe essere più presente una sottostringa di A che soddisfi la prima proprietà.
Per esempio:
A = xxxappleyyyyyyy
B = zapplezzz
La sottostringa apple
con indici 4 8
(indicizzazione da 1) sarebbe un output valido.
Funzionalità
Puoi presumere che l'input sarà su standard in o in un file nella directory locale, che è la tua scelta. Il formato del file sarà semplicemente due stringhe, separate da una nuova riga. La risposta dovrebbe essere un programma completo e non solo una funzione.
Vorrei infine testare il tuo codice su due sottostringhe tratte dalle stringhe in http://hgdownload.cse.ucsc.edu/goldenPath/hg38/chromosomes/ .
Punto
Questo è il code-golf con una svolta. Il codice deve essere eseguito in O(n)
tempo, dove n
è la lunghezza totale dell'input.
Lingue e biblioteche
Puoi usare qualsiasi lingua che abbia un compilatore / interprete / ecc. Liberamente disponibile. per Linux. Utilizzare solo librerie open source standard non progettate per risolvere questo compito. In caso di controversia, conterò questo come qualsiasi libreria che viene fornita di serie nella tua lingua o che puoi installare in una macchina Ubuntu predefinita da un repository predefinito.
Informazioni utili
Esistono almeno due modi per risolvere questo problema in tempo lineare. Uno è calcolare prima l'albero dei suffissi e il secondo è prima calcolare l'array di suffissi e l'array LCP.
- Ecco una spiegazione completa e (forse troppo) dettagliata della costruzione di alberi con suffisso temporale lineare (si scopre che alcune delle figure sono sfortunatamente sfortunate). C'è anche una bella risposta SO sulla costruzione di alberi con suffisso temporale lineare su https://stackoverflow.com/questions/9452701/ukkonens-suffix-tree-algorithm-in-plain-english . Include anche un collegamento al codice sorgente. Un'altra spiegazione dettagliata può essere trovata qui , questa volta dando una soluzione completa in C.
- La sezione 2 di http://www.cs.cmu.edu/~guyb/realworld/papersS04/KaSa03.pdf fornisce un algoritmo di costruzione di array di suffissi temporali lineare e l'Appendice A ha un codice sorgente C ++. Questa risposta spiega come calcolare quindi la sottostringa comune più lunga https://cs.stackexchange.com/questions/9555/computing-the-longest-common-substring-of-two-strings-using-suffix-arrays . Sezione 5 di https://courses.csail.mit.edu/6.851/spring12/scribe/lec16.pdf che ha anche una lezione video associata https://courses.csail.mit.edu/6.851/spring12/lectures/L16 .html spiega anche lo stesso algoritmo a partire dalle 1:16:00.
O(n) time
Sei sicuro che sia possibile?