Si vous faites une matrice 26X26 pour représenter le graphique dirigé du sommet comme chaque alphabet et les mots comme bord. Par exemple, le mot - APPLE connecte le sommet A et E avec l'arête dirigée de A à E. Maintenant, le problème se réduit à trouver la plus grande piste eulérienne (chemin qui comprend le nombre maximal d'arêtes, en visitant chaque arête une fois avec la répétition possible des sommets) dans le graphique. L'un des algorithmes O (E) consisterait à partir de façon aléatoire à partir d'une paire de sommets. Trouvez un chemin entre eux. Alors continuez à détendre le chemin jusqu'à ce qu'il soit possible.
update
@ GlenH7 J'ai résolu une question similaire sur www.hackerearth / jda récemment, il y avait des notes relatives par rapport à la meilleure solution et j'ai obtenu les notes les plus élevées avec l'approche suivante.
Liste donnée de mots. Trouvez la plus longue chaîne qui puisse être formée par eux. Une chaîne est valide si chaque mot commence par une lettre * se terminant à la fin du dernier mot.
Approch =
1) faire le graphique des alphabets comme des sommets et des mots comme des bords. Au lieu d'utiliser plusieurs arêtes, utilisez-en une dont le poids est égal au nombre d'arêtes.
2) trouver la composante fortement connectée du graphe avec des arêtes maximales. Jeter temporairement les autres bords.
3) Pour chaque sommet, faites son indegree égal à son outdegree.
4) Maintenant leur circuit eulérien existe dans le graphe. Trouve le.
5) Maintenant, dans le graphique restant (wrt graphique d'origine trouver le chemin le plus long avec le premier sommet dans la composante fortement connectée choisie. Je pense que c'est NP difficile.
6) Inclure le sentier ci-dessus dans le circuit Elérien convertissant le circuit eulérien en sentier.
Pourquoi - J'accepte que cette question est très probablement NP difficile (devinez, pas mathématiquement parlant). Mais l'approche ci-dessus fonctionne mieux quand il y a une longue liste (1000+) de mots uniformément distribués (c'est-à-dire non destinés à être wc pour l'approche ci-dessus). Supposons qu'après avoir converti la liste donnée en graphique mentionné ci-dessus, cela se révèle heureusement être un graphique eulérien (voir http://en.wikipedia.org/wiki/Eulerian_path pour les conditions), alors sans aucun doute, nous pouvons dire cette réponse à la question ci-dessus est P et est en fait le chemin eulérien dans le graphique (voir http://www.graph-magics.com/articles/euler.php pour une approche très simple à faire et voyez ceci pour vérifier que votre graphique a simple http://www.geeksforgeeks.org/strongly-connected-components/et sinon nettoyer temporairement d'autres petits scc car le chemin eulérien existe pour un seul scc). Ainsi, pour les cas non chanceux (qui sont presque tous des cas), j'essaie de les convertir en cas chanceux (c'est-à-dire que la condition de piste eulérienne est remplie). Comment faire ça? J'ai essayé d'augmenter la recherche de profondeur pour les arêtes non pertinentes (l'ensemble des arêtes dans un chemin partant du sommet avec un degré supérieur à l'indegree et se terminant au sommet avec un degré supérieur à l'indegree). L'augmentation de la recherche de profondeur signifie que j'ai d'abord recherché tout cet ensemble d'un bord dans le chemin, puis deux bords dans le chemin et ainsi de suite. Il peut sembler à première vue que la recherche en profondeur nécessiterait O (nœuds ^ i) donc la complexité temporelle totale de O (nœuds + nœuds ^ 2 + nœuds ^ 3 + ....) jusqu'à ce que ce soit un cas chanceux. Mais l'analyse amortie révélera qu'il s'agit de O (bords). Une fois qu'il est réduit, le cas chanceux trouve le circuit eulérien.
Jusqu'ici, c'était tout le temps polynomial. Cela donnerait presque la meilleure solution. Mais pour augmenter encore votre solution (la solution parfaite est NP difficile) essayez une approche gourmande dans le graphique restant pour trouver une longue traînée fixant l'un des sommets dans le scc choisi. Ajoutez maintenant ceci à la piste eulérienne trouvée ci-dessus pour l'augmenter encore.