我正在尝试构建一个接受字符串第一个元素的函数,并从字符串中删除所有其他元素。然后为第二个角色做同样的事情。
即 - “Heello”将成为“Helo”和“Chocolate”“Chlate”
我最初的尝试
removeSuccessor :: String -> String
removeSuccessor x = [c | c <- x, x ! `elem` c]
但这似乎不起作用......建议?
答案 0 :(得分:5)
你可以保留一组所有元素,如果还没有看到,只保留当前元素:
import Data.Set
removeDups :: Ord a => [a] -> Set a -> [a]
removeDups [] sofar = []
removeDups (x:rest) sofar
| member x sofar = (removeDups rest sofar)
| otherwise = x:(removeDups rest (insert x sofar))
用法:
removeDups "Heello" empty -- "Helo"
removeDups "Chocolate" empty -- "Choclate"
我认为运行时间为O(n log n)
。
或者您可以使用Data.List
中的nub
:
Prelude Data.List> import Data.List
Prelude Data.List> nub "Heello"
"Helo"
Prelude Data.List> nub "Chocolate"
"Choclate"
运行时间为O(n^2)
。