1
最長の繰り返しサブシーケンスを見つける
文字列与えられた場合、最も長い繰り返し(少なくとも2回)のサブシーケンスを見つけたいと思います。つまり、私は、文字列検索したいwののサブシーケンスである(連続している必要はありません)のように、W = ワット" ⋅ ワットを"。つまり、wは半分が連続して2回現れる文字列です。wはsのサブシーケンスですが、必ずしもサブストリングではないことに注意してください。ssswwwsssw=w′⋅w′w=w′⋅w′w=w' \cdot w' wwwwwwsss 例: 「ababccabdc」の場合は「abcabc」になります。これは、「ababccabdc」に「abc」=「abc」と「abc」が(少なくとも)2回表示されるためです。 「addbacddabcd」の場合、「dd」は2回表示されるため、1つのオプションは「dddd」です(同じ文字を複数回使用することはできませんが、ここでは4つの「d」があるので問題ありません)。ただし、lebngth 4です。長さ8の場合: 'abcdabcd'は、 'abcd'が 'addbacddabcd'のサブストリングであるため、2回出現します。 最長の繰り返しサブシーケンスを見つけることに興味があります。これは「最長/最大の正方形を見つける」とも呼ばれますが、正方形が部分列ではなく部分列に対して定義されている多くの記事を読みました。 文字列のブレークポイントのすべてのオプションを反復することでを取るブルートフォースアルゴリズムを簡単に使用できます。次に、最大/最長の共通サブシーケンスを検索する2つの文字列を作成しますが、各チェックは動的プログラミング手法を使用してO (n 2)を取るため、全体の時間はO (n 3)になります。私はO (n 2をとる最も長い共通部分列のためのより効率的なアルゴリズムを見つけましたO(n3)O(n3)O(n^3)O(n2)O(n2)O(n^2)O(n3)O(n3)O(n^3)なので、実行時間はO(n3O(n2logn)O(n2logn)O(\frac{n^2}{\log n})。O(n3logn)O(n3logn)O(\frac{n^3}{\log n}) 私は最長の繰り返しサブシーケンス問題のためのより効率的なアルゴリズムを探しています。おそらく、すべてのブレークポイントを反復するという私の考えは、時間を浪費しすぎて、反復回数を減らすことができます。あるいは、異なる姿勢のアルゴリズムがこの問題を解決できるかもしれません。 私は多くのジャーナルや以前の質問で検索してきましたが、私が見つけた結果のほとんどは部分列ではなく部分文字列に関するものでした。 これはサフィックスツリーを使用して実行できることも読みましたが、これもサブストリングに関連しており、そのようなアイデアをサブシーケンスに拡張できるかどうかはわかりません。 時間で実行されるソリューションを探しています。時間の1が存在する場合にはO (nは⋅ ログn個)でも良くなる(そのようなものが存在する場合、私はわかりません)。O(n2)O(n2)O(n^2)O(n⋅logn)O(n⋅logn)O(n \cdot \log n)