Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 14.05.2014
Сообщений: 6
1

Подпоследовательность

27.05.2014, 22:49. Показов 1088. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, решить!

Напишите функцию isSubsequenceOfMy::Eq a=>[a]->[a]->Bool, проверяющую, является ли одна строка подпоследовательностью другой.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2014, 22:49
Ответы с готовыми решениями:

Подпоследовательность ли?
Даны 2 последовательности. Нужно определить является ли вторая последовательность...

Подпоследовательность
Найти все подпоследовательности среди n последовательностей. На данный момент реализован алгоритм...

Последовательность и подпоследовательность
Дано n символов. Удалить из данной последовательности все группы букв вида abсd и удвоить остальные...

Наименьшая подпоследовательность
Найти отрицательную последовательность минимальной длины. Спасибо.

7
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
28.05.2014, 09:54 2
Haskell
1
2
3
4
5
6
7
isSubSeq :: (Eq a) => [a] -> [a] -> Bool
isSubSeq xs ys = (filter (\ y -> elem y xs) ys) == xs
 
Main> isSubSeq "abc" "qweadbc"
True
Main> isSubSeq "abc" "qweadcb"
False
0
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
28.05.2014, 11:27 3
Catstail, Неправда ваша, неправда ваша... Не всегда работает. Скажем для abc и abcc ваша функция вернёт False, хотя первая очевидно является подпоследовательностью второй...

Вот мой вариант.
Haskell
1
2
3
4
5
6
7
8
9
10
{-# Language LambdaCase#-}
isSubSeq :: (Eq a) => [a] -> [a] -> Bool
isSubSeq x y = isSubSeq' (x,y) || isSubSeq' (y,x)
  where
    isSubSeq' :: (Eq a) => ([a],[a]) -> Bool
    isSubSeq' = \case
      (x:sx,y:sy) | x == y -> isSubSeq' (sx,sy)
      (x:sx,y:sy)          -> isSubSeq' (x:sx,sy)
      (x:sx,_)             -> False
      _                    -> True
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
28.05.2014, 12:23 4
Не буду торопиться отказываться от своего варианта. Его можно чуть доработать:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
isSubSeq' :: (Eq a) => [a] -> [a] -> Bool
isSubSeq' xs ys = (foldl (\ acc y -> if (elem y xs) && not (elem y acc) then acc++[y] else acc) [] ys) == xs 
 
isSubSeq :: (Eq a) => [a] -> [a] -> Bool
isSubSeq xs ys = foldl (\ acc k -> acc || isSubSeq' xs (drop k ys)) False [1..(length ys)-(length xs)+1]
 
Main> isSubSeq "abc" "aabac"
True
Main> isSubSeq "abc" "aabaccc"
True
Main> isSubSeq "abc" "caabaccc"
True
Main> isSubSeq "abc" "aaba"
False
Добавлено через 17 минут
Нет, и у этого варианта есть изъян - он не допускает повторения символов в исходной строке.
0
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
28.05.2014, 13:26 5
Переписал своё решение... Стало в три раза короче...
Haskell
1
2
3
isSubSeq :: (Eq a) => [a] -> [a] -> Bool
isSubSeq (x:sx) (y:sy) = isSubSeq (if x == y then sx else x:sx) sy
isSubSeq x      _      = null x
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
28.05.2014, 15:24 6
А мне хотелось довести функциональное решение:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
isSubs :: (Eq a) => [a] -> [a] -> Bool
isSubs xs ys = (foldl (\ acc y -> w acc y) xs ys) == []
               where w xx yy = if xx==[] then []
                            else if head xx == yy then tail xx
                                    else xx
 
Main> isSubs "abc" "baabcc"
True
Main> isSubs "abc" "bbcc"
False
Main> isSubs "abc" "aabac"
True
Main> isSubs "aabc" "ababac"
True
Main> isSubs "bca" "ababac"
False
Хотя простая рекурсия в этой задаче, конечно, более уместна.
0
650 / 260 / 16
Регистрация: 02.03.2014
Сообщений: 587
28.05.2014, 15:58 7
Catstail, Чуть подкорректировал ваше решение...
Haskell
1
2
3
4
5
isSubs :: (Eq a) => [a] -> [a] -> Bool
isSubs x y = null $ foldl 
  (\xs y -> case xs of
    x:sx | x == y -> sx
    _             -> xs) x y
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,640
Записей в блоге: 13
28.05.2014, 16:21 8
Но, все-таки, здесь обычная рекурсия более уместна.
0
28.05.2014, 16:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2014, 16:21
Помогаю со студенческими работами здесь

Наименьшая отрицательная подпоследовательность
Здравствуйте, помогите пожалуйста с задачей. даны числа a1,a2 ... an. Найти наименьшую...

Четночередующаяся возрастающая подпоследовательность
Четночередующаяся возрастающая подпоследовательность ограничение времени на тест: 0.5 сек....

Частичная подпоследовательность последовательности
Помогите пожалуйста, или объясните, как это делать. 1. Существует ли такая последовательность {...

Задача «Общая подпоследовательность»
Добрый день. Имеется, с виду, тривиальная задача. Напрягает только то, что даны три...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru