26X26マトリックスを作成して、頂点の有向グラフを各アルファベットとして表し、単語をエッジとして表す場合。たとえば、APPLEは頂点AとEをAからEに向けられたエッジに接続します。問題は、グラフで最大のオイラー軌跡(エッジの最大数を含むパス、頂点の可能な繰り返しで各エッジを訪れる)を見つけることになります。O(E)アルゴリズムの1つは、頂点のペアからランダムに開始することです。それらの間のパスを見つけます。それが可能になるまでパスをリラックスし続けるよりも。
update
@ GlenH7最近www.hackerearth / jdaで同様の質問を解決しました。最良の解決策に関して相対的なマークがあり、次のアプローチで最高のマークを獲得しました。
与えられた単語のリスト。それらによって形成できる最長のチェーンを見つけてください。すべての単語が*最後の単語の終わりで終わる文字で始まる場合、チェーンは有効です。
アプローチ=
1)アルファベットを頂点としてグラフ化し、単語をエッジとして作成します。複数のエッジを使用する代わりに、エッジの数に等しい重みを持つエッジを使用します。
2)最大のエッジを持つグラフの強く接続されたコンポーネントを見つけます。他のエッジを一時的に破棄します。
3)各頂点について、その次数をその次数に等しくします。
4)グラフにオイラー回路が存在するようになりました。それを見つける。
5)残りのグラフ(wrt orignal graphで、選択された強く連結されたコンポーネントの最初の頂点を持つ最長の軌跡を見つけます。これはNP難しいと思います。
6)オイラー回路をトレイルに変換するエレリアン回路に上記のトレイルを含める。
なぜ-この質問はおそらくNPが難しい(数学的に言えば推測ではない)と思う。ただし、上記のアプローチは、均一に分散された単語の長いリスト(1000+)がある場合に最適に機能します(つまり、上記のアプローチでwcになることを意図していません)。与えられたリストを上記のグラフに変換した後、幸運なことにオイラーグラフであることがわかりました(条件については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をクリーニングしない場合)。したがって、ラッキーでないケース(ほとんどすべてのケース)については、それらをラッキーなケースに変換しようとします(つまり、オイラートレイル条件が満たされます)。これを行う方法?無関係なエッジ(outdegreeがindegreeよりも大きい頂点から始まり、indegreeがoutdegreeよりも大きい頂点で終わるパス内のエッジのセット)の深さ検索を増やしてみました。深さ検索の増加は、最初にパス内の2つのエッジなどよりも、パス内の1つのエッジのそのようなセットをすべて検索することを意味します。一見、i番目の深さ検索はO(nodes ^ i)を要するため、O(nodes + nodes ^ 2 + nodes ^ 3 + ....)の合計時間の複雑さがラッキーなケースになるまでに見えるかもしれません。ただし、償却分析ではO(edges)であることがわかります。ラッキーケースが減ったら、オイラー回路を見つけてください。
ここまでは、すべて多項式時間でした。これにより、ほぼ最良のソリューションが得られます。ただし、ソリューションをさらに向上させるには(完全なソリューションはNP困難です)、残りのグラフで貪欲なアプローチを試して、選択したsccの頂点の1つを見つめる長いトレイルを見つけてください。これを上記のオイラートレイルに追加して、さらに増加させます。