回答:
しましょう そして 指定された2つの文字列の長さ、
はい、与えられた2つの文字列の最も長い共通部分文字列は、 時間、アルファベットのサイズが一定であると仮定します。
これは、最も長い一般的な部分文字列の問題に関するWikipediaの記事からの抜粋です。
文字列のセットの最も長い共通の部分文字列は、文字列の一般化されたサフィックスツリーを作成し、その下のサブツリー内のすべての文字列からリーフノードを持つ最深の内部ノードを見つけることで見つけることができます。
与えられた2つの文字列に対して一般化されたサフィックスツリーを構築するには有名な独創的なウッコネンのアルゴリズムを使用して時間。両方の文字列に由来する最も深い内部ノードを見つけるには、時間。したがって、最長の共通部分文字列を見つけることができます 時間。
動作する実装については、GeeksforGeeksのSuffix Tree Application 5 – Longest Common Substringをご覧ください。
実際、与えられた2つの文字列の最も長い共通部分文字列は、 アルファベットのサイズに関係なく時間。
これは、Babenko、Maxim、Starikovskaya、Tatianaによる、サフィックス配列による最長の共通部分文字列の計算の要約です。(2008)。
一連の 文字列 全長の アルファベット以上 それぞれについて、見つけるように頼むかもしれません 、最長の部分文字列 少なくとも現れる ストリング 。この問題は、接尾辞の木の助けを借りて時間。ただし、結果のアルゴリズムはかなり複雑です(特に、特定の最も一般的でない祖先クエリへの応答が含まれます)時間)。また、その実行時間とメモリ消費は、。
このホワイトペーパーでは、サフィックスアレイの概念に依存する、上記の問題に対する非常にシンプルな代替アプローチを紹介します。いくつかの補助のサフィックス配列長さの文字列が計算され、簡単なものが必要です -要求された最長のサブストリングを見つけるための後処理。サフィックス配列を構築するための効率的でシンプルな線形時間アルゴリズムが最近開発されたので(定数は)、私たちのアプローチは非常に実用的であるようです。
上記の論文のアルゴリズムの一般的な考え方は次のとおりです。文字列をしましょう すべての連結であります センチネルを分離します。のサフィックス配列を作成しますまた、その最長共通接頭辞配列。これらの配列にスライディングウィンドウテクニックを適用して、最も長い共通の部分文字列を取得します。
はい。それに関するウィキペディアの記事さえあります! https://en.wikipedia.org/wiki/Longest_common_substring_problem
特に、Wikipediaで説明されているように、サフィックスツリー(またはサフィックス配列)を使用する線形時間アルゴリズムがあります。
「最も長い共通部分文字列」を検索すると、そのWikipediaの記事が最初のヒット(私にとって)になります。今後、こちらに質問する前に問題を調査してください。(たとえば、https://meta.stackoverflow.com/q/261592/781723を参照してください。)