Если вы сделаете матрицу 26X26 для представления ориентированного графа вершины в виде каждого алфавита и слов в качестве ребра. Например, слово - APPLE соединяет вершины A и E с ребром, направленным от A к E. Теперь задача сводится к поиску наибольшего эйлерова следа (путь, который включает в себя максимальное число ребер, посещение каждого ребра один раз с возможным повторением вершин) в графе. Один из алгоритмов O (E) должен был бы начать случайным образом с пары вершин. Найдите путь между ними. Затем продолжайте расслаблять путь, пока это не станет возможным.
update
@ GlenH7 Недавно я решил аналогичный вопрос на сайте www.hackerearth / jda, были отмечены относительные оценки в отношении наилучшего решения, и я набрал наивысшие оценки со следующим подходом:
Приведен список слов. Найдите самую длинную цепь, которую они могут сформировать. Цепочка действительна, если каждое слово начинается с буквы *, заканчивающейся в конце последнего слова.
Подход =
1) сделать граф алфавитов вершинами, а слова - ребрами. Вместо использования нескольких ребер используйте один с весом, равным количеству ребер.
2) найти сильно связную компоненту графа с максимальными ребрами. Временно откажитесь от других краев.
3) Для каждой вершины сделать ее степень равной ее степени.
4) Теперь существует их эйлерова схема в графе. Найди это.
5) Теперь в оставшемся графе (относительно графа сигнала найдите самый длинный след с первой вершиной в выбранном сильно связанном компоненте. Я думаю, что это сложно из NP.
6) Включите вышеупомянутый след в элерийскую цепь, преобразуя эйлерову цепь в след.
Почему - я принимаю, что этот вопрос, скорее всего, сложный для NP (угадайте, не говоря математически). Но вышеприведенный подход работает лучше всего, когда имеется длинный список (более 1000) равномерно распределенных слов (т. Е. Он не предназначен для использования в вышеописанном подходе). Предположим, что после преобразования указанного списка в граф, упомянутый выше, он, к счастью, оказывается эйлеровым графом (см. Условия http://en.wikipedia.org/wiki/Eulerian_path ), и, без сомнения, мы можем сказать, что ответ к вышеприведенному вопросу относится P и фактически является эйлеровым путем в графе (см. http://www.graph-magics.com/articles/euler.php для очень простого подхода и посмотрите, чтобы убедиться, что ваш граф имеет сингл http://www.geeksforgeeks.org/strongly-connected-components/и если нет, то временно очистите другой маленький scc, потому что эйлерова траектория существует для одного scc). Таким образом, для не счастливых случаев (которые являются почти всеми случаями) я пытаюсь преобразовать их в счастливые случаи (то есть условие эйлеровых следов выполнено). Как это сделать? Я попытался сделать поиск по глубине для нерелевантных ребер (набор ребер в пути, начинающийся с вершины со степенью больше, чем степень и заканчивающийся в вершине со степенью больше, чем степень). Увеличение глубины поиска означает, что сначала я искал весь такой набор одного ребра в пути, чем два ребра в пути и так далее. На первый взгляд может показаться, что i-й поиск глубины будет занимать O (узлы ^ i), таким образом, общая сложность времени O (узлы + узлы ^ 2 + узлы ^ 3 + ....), пока это не удачный случай. Но амортизированный анализ получит удовольствие - это O (ребра). Как только это уменьшится, повезет найти эйлерову схему.
До этого было все полиномиальное время. Это дало бы почти лучшее решение. Но чтобы еще больше увеличить ваше решение (идеальное решение - трудная задача NP), попробуйте какой-то жадный подход в оставшемся графе, чтобы найти длинный след, начинающийся с одной из вершин в выбранном scc. Теперь добавьте это к найденному выше эйлерову следу, чтобы еще больше увеличить его.