Due stringhe di lunghezza k , che differiscono in un carattere, condividono un prefisso di lunghezza L e un suffisso di lunghezza m tale che k = l + m + 1 .
La risposta di Simon Prins codifica questo memorizzando tutte le combinazioni prefisso / suffisso in modo esplicito, cioè abc
diventa *bc
, a*c
e ab*
. Quello è k = 3, l = 0,1,2 e m = 2,1,0.
Come sottolinea valarMorghulis, puoi organizzare le parole in un albero di prefissi. C'è anche l'albero dei suffissi molto simile. È abbastanza facile aumentare l'albero con il numero di nodi foglia sotto ciascun prefisso o suffisso; questo può essere aggiornato in O (k) quando si inserisce una nuova parola.
Il motivo per cui si desidera che questi conteggi dei fratelli siano così, come si sa, data una nuova parola, se si desidera enumerare tutte le stringhe con lo stesso prefisso o se enumerare tutte le stringhe con lo stesso suffisso. Ad esempio per "abc" come input, i possibili prefissi sono "", "a" e "ab", mentre i suffissi corrispondenti sono "bc", "c" e "". Come ovvio, per brevi suffissi è meglio elencare i fratelli nella struttura del prefisso e viceversa.
Come sottolinea @einpoklum, è certamente possibile che tutte le stringhe condividano lo stesso prefisso k / 2 . Questo non è un problema per questo approccio; l'albero del prefisso sarà lineare fino alla profondità k / 2 con ciascun nodo fino alla profondità k / 2 che è l'antenato di 100.000 nodi fogliari. Di conseguenza, l'albero dei suffissi verrà utilizzato fino alla profondità (k / 2-1), il che è positivo perché le stringhe devono differire nei loro suffissi dato che condividono i prefissi.
[modifica] Come ottimizzazione, una volta determinato il prefisso univoco più breve di una stringa, sai che se c'è un carattere diverso, deve essere l'ultimo carattere del prefisso e avresti trovato il quasi duplicato quando controllando un prefisso che era uno più corto. Quindi se "abcde" ha un prefisso univoco più breve "abc", significa che ci sono altre stringhe che iniziano con "ab?" ma non con "abc". Cioè se differissero in un solo personaggio, sarebbe quel terzo personaggio. Non è più necessario cercare "abc? E".
Con la stessa logica, se scoprissi che "cde" è un suffisso univoco più breve, allora sai che devi controllare solo il prefisso "ab" di lunghezza 2 e non i prefissi di lunghezza 1 o 3.
Si noti che questo metodo funziona solo per differenze di un carattere esatte e non generalizza a differenze di 2 caratteri, ma si basa su un carattere unico che è la separazione tra prefissi identici e suffissi identici.