Data una stringa , vorrei trovare la sottosequenza ripetuta (almeno due volte) più lunga. Cioè, vorrei trovare una stringa che è una sottosequenza (non deve essere contigua) di tale che . Cioè, è una stringa le cui metà appaiono due volte di seguito. Nota che è una sottosequenza di , ma non necessariamente una sottostringa.
Esempi:
Per "ababccabdc" sarà "abcabc", perché "abc" = "abc" e "abc" appaiono (almeno) due volte in "ababccabdc".
Per 'addbacddabcd' un'opzione è 'dddd' perché 'dd' appare due volte (non posso usare la stessa lettera più volte, ma qui ho 4 'd così va bene), ma è di lebngth 4. Posso trovarne una migliore di lunghezza 8: 'abcdabcd', perché 'abcd' è una sottostringa di 'addbacddabcd' che appare due volte.
Sono interessato a trovare la sottosequenza ripetuta più lunga. Questo è anche chiamato "trovare il quadrato più lungo / più grande", ma ho letto molti articoli in cui un quadrato è definito per una sottostringa e non per una sottosequenza.
Posso facilmente usare un algoritmo di forza bruta che prenderà ripetendo tutte le opzioni per un punto di interruzione nella stringa, e quindi avrò due stringhe in cui cercherò la sottosequenza comune più grande / più lunga, ma ogni controllo prenderà usando una tecnica di programmazione dinamica, quindi tutto il tempo sarà . Ho trovato un algoritmo più efficiente per la sottosequenza comune più lunga che richiede , quindi il tempo di esecuzione sarà .
Sto cercando un algoritmo più efficiente per il problema di sottosequenza che si ripete più a lungo. Forse la mia idea di iterare su tutti i punti di interruzione fa perdere troppo tempo e può essere ridotta a meno iterazioni. O forse un algoritmo con un atteggiamento diverso può risolvere questo problema.
Ho cercato in molte riviste e domande precedenti e la maggior parte dei risultati che ho trovato riguardavano una sottostringa e non una sottosequenza.
Ho anche letto che questo può essere fatto usando gli alberi dei suffissi, ma anche questo era rilevante per le sottostringhe e non sono sicuro che una tale idea possa essere estesa per sottosequenza.
Sto cercando una soluzione che funzioni nel tempo . Se esiste uno nel tempo sarebbe ancora meglio (non sono sicuro che esista).
$
, risolvendo il problema LCS.