Я написал функцию для поиска самой длинной общей подпоследовательности (LCS).Например, для двух последовательностей символов BANANA и ATANA он возвращает 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')
...and so on for all other <i>Seq</i>s...
Было бы замечательно, если бы LCS мог также обрабатывать String s и Array s:
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 и т. Д.
Спасибо!