import Data.List (subsequences, intersect)
-- 1ª definición
-- =============
maximo1 :: Eq a => [a] -> [a] -> Int
maximo1 xs ys =
maximum (map length (sublistasComunes xs ys))
-- (sublistasComunes xs ys) es la lista de las sublistas comunes de xs e
-- ys. Por ejemplo,
sublistasComunes :: Eq a => [a] -> [a] -> [[a]]
sublistasComunes xs ys =
subsequences xs `intersect` subsequences ys
-- 2ª definición
-- =============
maximo2 :: Eq a => [a] -> [a] -> Int
maximo2 l1@(x:xs) l2@(y:ys)
| x == y = 1 + maximo2 xs ys
| otherwise = max (maximo2 xs l2) (maximo2 l1 ys)
maximo2 _ _ = 0
-- Comparación de eficiencia
-- =========================
-- λ> maximo1 [1,4..30] [2,4..30]
-- 5
-- (3.60 secs, 0 bytes)
-- λ> maximo2 [1,4..30] [2,4..30]
-- 5
-- (1.58 secs, 216,347,472 bytes)
--
-- λ> maximo2 [1..10^6] [1..10^6]
-- 1000000
-- (2.44 secs, 407,051,096 bytes)