0

我正在尝试构建一个函数,该函数采用字符串的第一个元素,并从字符串中删除与它相等的所有其他元素。然后对第二个字符做同样的事情。

即——“Heello”会变成“Helo”和“Chocolate”“Chlate”

我最初的尝试

removeSuccessor :: String -> String
removeSuccessor x = [c | c <- x, x ! `elem` c]

但这似乎不起作用..建议?

4

1 回答 1

6

您可以保留一组所有元素,如果尚未看到,则仅保留当前元素:

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),我想。

或者您可以使用nubfrom Data.List

Prelude Data.List> import Data.List
Prelude Data.List> nub "Heello"
"Helo"
Prelude Data.List> nub "Chocolate"
"Choclate"

运行时间为O(n^2).

于 2013-10-15T19:17:28.950 回答