Якщо ви зробите матрицю 26X26 для відображення спрямованого графа вершин як кожного алфавіту, а слова як ребра. Наприклад, слово - APPLE з'єднати вершини A і E з ребром, спрямованим від A до E. Тепер проблема зводиться до пошуку найбільшого ейлерового сліду (шлях, який включає в себе максимальну кількість ребер, відвідування кожного краю один раз з можливим повторенням вершин) у графі. Одним з алгоритмів O (E) було б починати випадковим чином з пари вершин. Знайдіть шлях між ними. Тоді продовжуйте розслабляти шлях, поки це можливо.
update
@ GlenH7 Нещодавно я вирішив подібне запитання на www.hackerearth / jda, щодо найкращого рішення були відносні оцінки, і я набрав найвищі бали з наступним підходом-
Дано список слів. Знайдіть найдовший ланцюг, який може бути сформований ними. Ланцюжок дійсний, якщо кожне слово починається з букви *, що закінчується в кінці останнього слова.
Приближення =
1) складіть графік алфавітів як вершини, а слова як ребра. Замість використання декількох ребер використовуйте один із вагою, рівним кількості ребер.
2) знайти сильно пов'язаний компонент графа з максимальними ребрами. Тимчасово відкиньте інші краї.
3) Для кожної вершини зробіть її інгредієнт рівним її завищенню.
4) Тепер у графіку існує їхня ейлерова схема. Знайди це.
5) Тепер у графі, що залишився (wrt оригінальний графік, знайдіть найдовший слід із першою вершиною у вибраному сильно з'єднаному компоненті. Я думаю, що це 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). Таким чином, для не щасливих випадків (які майже у всіх випадках) я намагаюся перетворити їх на випадкові випадки (тобто умови ейлерового сліду виконуються). Як це зробити? Я намагався зробити пошук глибини для невідповідних ребер (сукупність ребер в шляху, що починається від вершини з перевищенням величини, ніж невирішене, і закінчується у вершині з величиною, що перевищує невирішеність). Збільшення пошуку по глибині означає, що спершу я шукав весь такий набір одного краю шляху, ніж два ребра в шляху і так далі. На перший погляд може здатися, що пошук по глибині зайняв би O (вузли ^ i), таким чином, загальна часова складність O (вузли + вузли ^ 2 + вузли ^ 3 + ....), поки це не вдалий випадок. Але амортизований аналіз сподобається, що це O (ребра). Як тільки це скорочено, щасливий випадок знайдіть ейлерову ланцюг.
До цього це був увесь полином. Це дало б майже найкраще рішення. Але для подальшого збільшення вашого рішення (ідеальне рішення - важке NP), спробуйте якийсь жадібний підхід у графі, що залишився, щоб знайти довгий слід, який дивився однією з вершин обраної області. Тепер додайте це до вище знайденого еулерового сліду для подальшого його збільшення.