Supponiamo che ci venga data una raccolta di stringhe, . Vorrei sapere se una di queste stringhe è una sottostringa di qualsiasi altra stringa nella raccolta. In altre parole, vorrei un algoritmo per la seguente attività:S 1 , … , S n
Input:
Output: tale che è una sottostringa di e , o None se tale esistonoS i S j i ≠ j i , j
Esiste un algoritmo efficiente per questo?
Se sostituiamo "sottostringa" con "prefisso", esiste un algoritmo efficiente (ordina le stringhe, quindi esegui una scansione lineare per confrontare le stringhe adiacenti; l'ordinamento assicurerà che le sottostringhe siano adiacenti). Ma sembra più difficile verificare se una stringa è una sottostringa di qualsiasi altra stringa. Un algoritmo ingenuo deve iterare su tutte le coppie , ma ciò richiede test di sottostringa . Esiste un algoritmo più efficiente?Θ ( n 2 )
Immagino che potremmo chiamare questo "test di sottostringa a tutte le coppie", o qualcosa del genere.
Il mio obiettivo finale è quello di potare la raccolta in modo che nessuna stringa sia una sottostringa di un'altra, rimuovendo ciascuna che è una sottostringa di qualcos'altro nella raccolta.