私は解決策を得たと思いますO(n)。それはいくつかのステップで行われます。
まず、問題を再定式化します。残っているものが等しくなるようにA、部分文字列と部分文字列を削除する必要があります。Bそして、可能な限り短い部分文字列を削除したいと考えてAいます。挿入操作は、実際には での同じ削除操作と同等であることに注意してくださいB。
レンマ。Aとの両方から同じ接頭辞または接尾辞を削除してもB、最適解には影響しません。読者に証拠を残してください:)
ここで、Aandの最大の共通サフィックスとプレフィックスを抽出します。orが空の場合は、単純な縮退ケースになります。そうでない場合は、新しい表記法,を作成しましょう。BA=XA*YB=XB*YXYA*B*A<-A*B<-B*
この時点first(A) != first(B)で、last(A) != last(B). それ以外の場合は、前のステップでプレフィックスまたはサフィックスに共通の記号を含める必要があります。
A = a1 A' a2
B = b1 B' b2
ここa1 = first(A)で、a2 = last(A)、b1 = first(B)、b2 = last(B)およびはA'およびのB'部分文字列です。ここでは、.ABa1 != b1a2 != b2
等しくするAにBは、文字列の 1 つから最初の記号を削除し、もう 1 つの文字列から最後の記号を削除する必要があります。ここには 2 つのケースがあります。Aから最初の記号を削除し、 から最後の記号を削除する 1 つだけを考えてみましょうB。
ここで行う必要があるのは、 の先頭から可能な限り少ない記号を削除してA、残った接尾辞が の接頭辞と等しくなるようにすることだけですB。そのためには、文字列のサフィックス ツリーAを構築し、すべてのプレフィックスBを調べて、それらがサフィックス ツリーに表示されているかどうかを確認する必要があります。次に、最大のものを選択します。完了すると、最大の文字列が得られますC。これは、の接尾辞Aと接頭辞ですB。
A = PC
B = CS
Pから取り外しAて完了ですS。B
オリジナルAとB(共通部分を削除していない)の場合、次のようになります。
A = XPCY
B = XCSY
問題の元の定式化では、Pが削除され、S挿入されます。
サフィックス ツリーは で構築できますO(n)。最初のステップで最も一般的な接尾辞と接頭辞を取り除くにはO(n). サフィックス ツリーのトラバーサルは で行われO(n)ます。