Si realiza una matriz 26X26 para representar el gráfico dirigido de vértice como cada alfabeto y las palabras como borde. Por ejemplo, la palabra: APPLE conecta el vértice A y E con el borde dirigido de A a E. Ahora el problema se reduce a encontrar el rastro euleriano más grande (ruta que incluye el número máximo de bordes, visitando cada borde una vez con la posible repetición de vértices) en el gráfico. Uno de los algoritmos O (E) sería comenzar aleatoriamente desde un par de vértices. Encuentra un camino entre ellos. Que seguir relajando el camino hasta que sea posible.
update
@ GlenH7 Resolví una pregunta similar en www.hackerearth / jda recientemente, hubo marcas relativas con respecto a la mejor solución y obtuve las calificaciones más altas con el siguiente enfoque:
Lista de palabras dada. Encuentra la cadena más larga que puedan formar. Una cadena es válida si cada palabra comienza con una letra * que termina al final de la última palabra.
Aproximación =
1) haz la gráfica de los alfabetos como vértices y las palabras como bordes. En lugar de usar varios bordes, use uno con un peso igual al número de bordes.
2) encuentre el componente fuertemente conectado del gráfico con aristas máximas. Deseche temporalmente otros bordes.
3) Para cada vértice, haga que su grado de entrada sea igual a su grado de salida.
4) Ahora existe su circuito euleriano en gráfico. Encuéntralo.
5) Ahora en el gráfico restante (gráfico original de wrt, encuentre el camino más largo con el primer vértice en el componente fuertemente conectado elegido. Creo que esto es NP difícil.
6) Incluya la ruta anterior en el circuito Eleriano convirtiendo el circuito euleriano en ruta.
Por qué: acepto que esta pregunta es probablemente NP difícil (supongo, no matemáticamente hablando). Pero el enfoque anterior funciona mejor cuando hay una larga lista (más de 1000) de palabras distribuidas uniformemente (es decir, no está destinado a ser wc para el enfoque anterior). Supongamos que después de convertir la lista dada al gráfico mencionado anteriormente, afortunadamente resulta ser un gráfico euleriano (consulte http://en.wikipedia.org/wiki/Eulerian_path para conocer las condiciones), entonces sin ninguna duda podemos decir esa respuesta la pregunta anterior es P y en realidad es la ruta euleriana en el gráfico (consulte http://www.graph-magics.com/articles/euler.php para obtener una aproximación muy simple y verifique que su gráfico tenga solo http://www.geeksforgeeks.org/strongly-connected-components/y si no se limpia temporalmente otro scc pequeño porque existe una ruta euleriana para scc único). Por lo tanto, para los casos no afortunados (que son casi todos los casos) trato de convertirlos en casos afortunados (es decir, se cumplen las condiciones del rastro euleriano). ¿Como hacer esto? Intenté hacer una búsqueda de profundidad creciente para bordes irrelevantes (el conjunto de bordes en una ruta que mira desde el vértice con un grado mayor que indegrado y que termina en el vértice con un grado mayor que excedido). La búsqueda de profundidad creciente significa que primero busqué todo el conjunto de un borde en la ruta que dos bordes en la ruta y así sucesivamente. A primera vista puede parecer que la búsqueda de profundidad i-ésima tomaría O (nodos ^ i), por lo tanto, la complejidad del tiempo total de O (nodos + nodos ^ 2 + nodos ^ 3 + ....) hasta que sea un caso afortunado. Pero el análisis amortizado lo deleitará es O (bordes). Una vez que se reduce el caso de la suerte, busca el circuito euleriano
Hasta aquí todo era tiempo polinómico. Esto daría casi la mejor solución. Pero para aumentar aún más su solución (la solución perfecta es NP difícil) intente un enfoque codicioso en el gráfico restante para encontrar un camino largo mirando con uno de los vértices en el scc elegido. Ahora agregue esto al rastro euleriano encontrado anteriormente para aumentarlo aún más.