Il mio amico mi ha dato un problema che dice sia facile, ma non riesco a capire un buon algoritmo da usare per farlo.
Ti viene dato un input di 100 parole inglesi casuali. Devi trovare la stringa di parole più lunga in cui l'ultima lettera in una parola corrisponde alla prima lettera nella parola successiva. Puoi usare ogni parola una sola volta.
Ad esempio, se ti venissero date le parole "gatto", "cane", "quello", la stringa più lunga che potresti creare sarebbe "gatto -> quello". Se ti venissero date le parole "mouse", "alce", "unicorno", la stringa più lunga che potresti creare sarebbe solo una parola (dal momento che nessuna di queste parole collega). Se ti venissero date le parole "uccello", "parabola", "arbusto", la stringa più lunga che potresti creare sarebbe "arbusto -> uccello -> piatto" (o "piatto -> arbusto -> uccello" o "uccello - > dish -> harb ").
Mi è venuta l'idea di modellarlo come un grafico ciclico diretto. Ogni nodo sarebbe solo una parola, con i vertici che vanno a ciascuna parola / nodo che inizia con la lettera con cui termina questa parola.
+-------+ \ +------+
| cat |-----------| that |
+-------+ / +------+
| |
\|/ |
+-------+ / |
| the |--------------+
+-------+ \
Questo problema sembra essere una ricerca del percorso più lungo , che è NP-Hard.
C'è un modo migliore per farlo? O anche una sorta di algoritmo di approssimazione che potrebbe essere usato? O un modo per sfruttare le qualità dell'inglese per ridurre lo spazio di ricerca?