最長共通部分列(LCS)を見つける関数を作成しました。たとえば、chars BANANAとATANAの2つのシーケンスの場合、AANAを返します。実装は再帰的アルゴリズムの素朴で非効率的な適応ですが、この質問の目的には関係ありません。
def LCS[T](a: Seq[T], b: Seq[T]): Seq[T] = {
if (a.isEmpty || b.isEmpty)
Seq.empty
else if (a.head == b.head)
a.head +: LCS(a.tail, b.tail)
else {
val case1 = LCS(a.tail, b)
val case2 = LCS(a, b.tail)
if (case1.length > case2.length) case1 else case2
}
}
この関数を可能な限り一般的な方法でリファクタリングしたいと思います。現在の実装は、あらゆるタイプの入力シーケンスで機能しますが、常にタイプList[T]のコレクションを返します。私は次の行動を達成したい:
LCS(List('B'、'A'、'N'、'A'、'N'、'A')、List('A'、'T'、'A'、'N'、'A' ))-> List('A'、'A'、'N'、'A') LCS(Vector('B'、'A'、'N'、'A'、'N'、'A')、Vector('A'、'T'、'A'、'N'、'A' ))-> Vector('A'、'A'、'N'、'A') ...他のすべてのSeqについても同様です。
LCSが文字列と配列も処理できれば素晴らしいと思います。
LCS( "BANANA"、 "ATANA")-> "AANA" LCS(Array('B'、'A'、'N'、'A'、'N'、'A')、Array('A'、'T'、'A'、'N'、'A' ))-> Array('A'、'A'、'N'、'A')
Scala 2.8ジェネリックコレクションライブラリの助けを借りて、少なくとも最初の要件を達成することが可能であると私は信じています。より高度なポリモーフィズム、型クラス、CanBuildFromなどの「重い」機械を見て喜ぶでしょう。
ありがとう!