Segmentos comunes maximales
Los segmentos de «abcd» son
1 |
["","a","ab","abc","abcd","b","bc","bcd","c","cd","d"] |
Los segmentos comunes de «abcd» y «axbce» son
1 |
["","a","b","bc","c"] |
Los segmentos comunes maximales (es decir, no contenidos en otros segmentos) de «abcd» y «axbce» son
1 |
["a","bc"] |
Definir la función
1 |
segmentosComunesMaximales :: Eq a => [a] -> [a] -> [[a]] |
tal que (segmentosComunesMaximales xs ys) es la lista de los segmentos comunes maximales de xs e ys. Por ejemplo,
1 2 |
segmentosComunesMaximales "abcd" "axbce" == ["a","bc"] segmentosComunesMaximales [8,8] [8] == [[8]] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import Data.List (inits, tails, isInfixOf) segmentosComunesMaximales :: Eq a => [a] -> [a] -> [[a]] segmentosComunesMaximales xs ys = nub [zs | zs <- zss , null [us | us <- zss, zs `isInfixOf` us, us /= zs]] where zss = segmentosComunes xs ys segmentosComunes :: Eq a => [a] -> [a] -> [[a]] segmentosComunes xs ys = [zs | zs <- segmentos xs , zs `isInfixOf` ys] -- (segmentos xs) es la lista de los segmentos de xs. Por ejemplo, -- segmentos "abc" == ["","a","ab","abc","b","bc","c"] segmentos :: [a] -> [[a]] segmentos xs = [] : concatMap (tail . inits) (init (tails xs)) |
7 Comentarios