問題
文字列 a および b が与えられます。 a の部分列かつ b の部分列であるような文字列のうち、最長のものをひとつ求めてください。 【注釈】 文字列 x の 部分列 とは、x から 0 個以上の文字を取り除いた後、 残りの文字を元の順序で連結して得られる文字列のことです。
解法・ソースコード
最長共通部分列 の長さを求める問題は以前の記事で解いています。
最長共通部分列(動的計画法③)- https://ailogsite.netlify.app/2022/12/16/2022/1216/
今回は、さらに「最長共通部分列を具体的にどれか1つ」求める方法を考えます。
基本的な考え方としては メモ化テーブルの 終端ノード memo[(len(a), len(b)] から順に どのノードから更新されて来たのか、その元となる部分を辿って行く ことになります。
メモ化テーブルの値を見ながら、今いる ノード (i, j) がどのノードから更新されて来たのかを特定し、求める 最長共通部分の文字列 を復元していきます。
[Google Colaboratory]
1 | #---------- 入力例1 ---------- |
[実行結果(入力例1)]
長さ: 3 解: axb
答えは axb または ayb です。 どちらを出力しても正解です。
[実行結果(入力例2)]
長さ: 2 解: aa
答えは aa となります。
[実行結果(入力例3)]
長さ: 0 解:
答えは (空文字列) です。
[実行結果(入力例4)]
長さ: 7 解: aaadara
答えは aaadara となります。