Se crei una matrice 26X26 per rappresentare il grafico diretto del vertice come ogni alfabeto e parole come bordo.
Ad esempio word - APPLE connette il vertice A ed E con lo spigolo diretto da A a E.
Ora il problema si riduce alla ricerca della più grande traiettoria Euleriana (percorso che include il numero massimo di bordi, visitando ogni spigolo una volta che è possibile la ripetizione dei vertici) nel grafico.
Uno degli algoritmi O (E) sarebbe quello di iniziare in modo casuale da una coppia di vertici.
Trova un percorso tra di loro. Quindi continua a rilassare il percorso finché è possibile.
Aggiorna
@ GlenH7 Ho risolto una domanda simile su www.hackerearth / jda di recente, c'erano dei voti relativi rispetto alla soluzione migliore e ho ottenuto il punteggio più alto con il seguente approccio -
Fornito un elenco di parole. Trova la catena più lunga che può essere formata da loro. Una catena è valida se ogni parola inizia con una lettera * che termina alla fine dell'ultima parola.
Approch =
1) crea il grafico degli alfabeti come vertici e parole come bordi.
Al posto di utilizzare più spigoli, utilizzare uno con un peso uguale a
numero di bordi.
2) trova la componente strongmente connessa del grafico con
bordi massimi. Scarta temporaneamente altri bordi.
3) Per ogni vertice rendi il suo indice uguale al suo outdegree.
4) Ora il loro circuito euleriano esiste nel grafico. Trovalo.
5) Ora nel grafico rimanente (il grafico originale w.r.t trova il più lungo
sentiero con primo vertice in scelto strongmente connesso
componente. Penso che questo sia NP difficile.
6) Includere la traccia di cui sopra nel circuito eleriano che converte l'euleriano
circuito in pista.
Perché - Accetto che questa domanda sia molto probabilmente NP (suppongo, non matematicamente parlando). Ma l'approccio di cui sopra funziona meglio quando c'è una lunga lista (1000+) di parole uniformemente distribuite (cioè non inteso per essere w.c. per l'approccio sopra).
Supponiamo che dopo aver convertito una lista data in un grafico sopra menzionato, per fortuna si rivelerà un grafico euleriano (vedi link per condizioni), quindi senza alcun dubbio possiamo dire che la risposta alla domanda precedente è P ed è in realtà il percorso euleriano nel grafico (vedi link per un approccio molto semplice e vedi questo per verificare che il tuo grafico abbia un singolo link e se non pulisce temporaneamente altri piccoli scc perché esiste un percorso euleriano per single scc). Quindi per i casi non fortunati (che sono quasi tutti i casi) cerco di convertirli in casi fortunati (vale a dire che le condizioni del sentiero euleriano sono soddisfatte). Come fare questo? Ho provato ad aumentare la profondità di ricerca per i bordi irrilevanti (l'insieme di spigoli in un percorso che guarda dal vertice con outdegree maggiore di un indegree e termina al vertice con un indice maggiore rispetto ad un altro). Aumentare la profondità di ricerca significa che per prima cosa ho cercato tutti questi set di un bordo in un percorso rispetto a due bordi nel percorso e così via. Può sembrare a prima vista che con la ricerca di profondità occorrerebbe O (nodi ^ i) quindi la complessità temporale totale di O (nodi + nodi ^ 2 + nodi ^ 3 + ....) finché non si tratta di un caso fortunato. Ma l'analisi ammortizzata rivelerà che è O (bordi). Una volta ridotto il caso fortunato, trova il circuito euleriano.
Fino a qui era tutto il tempo polinomiale. Questo darebbe quasi la soluzione migliore. Ma per aumentare ulteriormente la tua soluzione (la soluzione perfetta è NP difficile) prova un approccio avido nel grafico rimanente per trovare una lunga traccia che fissa con uno dei vertici nello scc scelto. Ora aggiungilo al tracciato euleriano sopra riportato per aumentarlo ulteriormente.