最長の回文サブシーケンスを見つけるための最速のアルゴリズム


8

まず最初に、単語と目的のサイズを読み取る必要があります。
次に、この単語の文字が順番に使用されて作成された最長の回文を見つける必要があります。
たとえば、サイズ= 7、単語= "abcababac"の場合、答えは7( "abababa")です。

追記:単語のサイズが3000未満です。


最大回文とは、文字列から文字を削除して回文を残すことができ、最長の回文(または最小の削除)が必要なことを意味しますか?

1
あなたの例では、長さ7のcababacもあります。その後、削除された文字は互いに隣り合って最後に配置されます。これらの制限のいずれかを許可されていますか?彼らは非常に検索を簡素化します。

6
これは既にスタックオーバーフローで回答されています。最長の回文サブシーケンスを見つける方法は?

@GenericHuman:その質問の最良の答えは、質問者が読んでいた教科書の章に適していました。これはこの質問者にとっては良い答えではありません。この質問をご覧ください:代わりにstackoverflow.com/questions/7043778/…
ニールG

1
サイズの使い方は?「最大パリンドローム」が必要だと言ったので、最長の回文構造が指定されたサイズよりも長いまたは短い場合はどうなりますか?
Gilles「SO-邪悪なことをやめなさい」

回答:


6

Manacherのアルゴリズムにちなんで名付けられたアルゴリズムがあります。これは非常に高速な線形時間アルゴリズムです。

ウィキペディアのリファレンスを見る


追記:Zアルゴリズムに精通している場合は、Zアルゴリズムが似ていることがわかります。


編集する

OPの意味を誤解しました(ただし、処理中の情報を削除したくありません。多少便利です)。彼は文字列の最も長い回文のサブシーケンスを意味するので、動的プログラミングは良いようです:

fj,k=max(fj,k+1,fj+1,k,2[Sj=Sk]+fj+1,k1),j<kfk,k=1fj,k=0,j>k
どこ fj,k の最長回文サブシーケンスの長さを示します Sj..k、および [P]アイバーソンは、ブラケット、私はそれだけのようだと思うLCS

4
あなたは部分文字列のケースで答えていますが、問題は部分列についてです。

最初の項をf(j、k-1)にすべきではありませんか?
Abhishek Bansal 2014

5

私が考えることができる最速のアルゴリズムは、クリエイティブな方法でLCSを適用することです。この問題は、O(N ^ 2)時間とO(N ^ 2)空間で解決できます。ここで、Nは文字列のサイズです。

LCS(S、reverse(S))は、最大の回文サブシーケンスが文字列Sとその逆の間の最大の共通サブシーケンスになるため、最大の回文サブシーケンスを提供します。

たとえば、
S = "abcababac"
T = "cababacba"(Sの逆)
LCS(S、T)= "abababa"


質問が尋ねているように、このアルゴリズムは誰もが思いつくことができる最も速いものであると主張できますか?
Juho

@Juho:できません。:(これは私が知っている最速のアルゴリズムです。しかし、これはUVAオンライン裁判官(uva.onlinejudge.org/external/114/11404.html)で受け入れられ、ACMでは問題の制約は最適化されたソリューションのみが通過するようになっています。したがって、ソリューションは十分高速であり、最速かどうかは不明です
Shashwat

2

文字列のLPSを見つける問題は、2つの文字列の最長共通サブシーケンスを見つけることに変換できます。この場合、1つの文字列が元の文字列になり、2番目の文字列は元の文字列の逆になります。

Longest Common Subsequenceの問題は、パターンマッチングの問題と似ていますが、テキスト内の文字をスキップできる点が異なります。また、目標は、できるだけ長い1つの一致のみを返すことです。

LCSは O(n2) 再帰とメモ化を使用します。

MasekとPatersonによって発見された、時間の複雑さのやや速いアルゴリズムが存在します。 O(n2/lgn)。紙のリンク:マセックとパターソン

2つの文字列のLCSを計算するためにHirschbergによって提示された他の2つのアルゴリズム A (サイズ n)および B (サイズ m)。これらの文字列に表示される可能性がある記号は、サイズのアルファベットから来るという仮定に基づいていますt(実際には、ほとんどの場合に当てはまります)。したがって、シンボルは以下を使用してメモリに保存できます。log(t)メモリの1ワードに収まるビット。2つのシンボルを比較できますO(1)時間。文字列の異なる数Bsもちろん、どちらよりも少ない m そして t

  1. これは必要です O(pn+nlgn) どこで pLCSの長さです。これは、LCSの長さが短いことが予想される場合に使用されます。ダイナミックプログラミングを使用してこの問題を解決すると、マトリックスのほとんどのエントリが同じになるため、スパースダイナミックプログラミングのアイデアを使用できます。

  2. このアルゴリズムには、 O(p(m+1p)logn)時間。これは、LCSの長さが近い場合に非常に効率的です。m、その場合、それは O(nlgn)

詳細な手順とアルゴリズムは、ヒルシュベルクの論文で説明されています。

別の優れたアルゴリズムがSohel Rahmanによって提案されており、 O(Rloglogn) 時間、場所 R文字列が一致する、順序付けられた位置のペアの総数です。該当しない場合R の順序です O(n2)、しかし多くの場合、 R の順序です n。これはRMQ(範囲最大クエリ)の概念を使用しています。紙のリンク:ラーマン


@FrankW、ありがとう!回答を編集しました。これでリンクが表示されます。
Surendra 2014

あなたのフォーマットはまだ欠けていました。私の編集をチェックして、何が可能かを確認してください。記事の参照は、リンクがいつまでも機能することに常に依存しているため、依然として悪いものです。アドバイスはこちらをご覧ください。タイトル、著者、年を(少なくとも)指定する必要があります。
ラファエル

あなたが書くことに関する2つの懸念:1)「必要です O()"は意味がありません(それ以降 O上限を与える)、そしておそらく間違っていることを無視します; 私はそれらがこれらの次数の上限を示していると思いますが、アルゴリズムさらに高速かもしれません。2)少なくとも最後の段落では、Ω(n2)
ラファエル

-1

それは私にはかなり些細なことのように思われるので、私はおそらく何かを逃しています。次に、各ペアの最初の文字を左側に配置し、他の文字を右側に配置し、残りの文字がある場合(つまり、他の文字とペアになっていない文字)、それらの1つを選択して、その文字を中間。


1
あなたが持っているとき aubvawb (と u,v,w 言葉)、回文の最初と最後の文字をどうするかをどのように決定しますか a または b?あなたはの内容を調べる必要がありますu,v,wパリンドロームを最長にするかどうかを決める前に。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.