我正在尝试构建一个函数,该函数采用字符串的第一个元素,并从字符串中删除与它相等的所有其他元素。然后对第二个字符做同样的事情。
即——“Heello”会变成“Helo”和“Chocolate”“Chlate”
我最初的尝试
removeSuccessor :: String -> String
removeSuccessor x = [c | c <- x, x ! `elem` c]
但这似乎不起作用..建议?
我正在尝试构建一个函数,该函数采用字符串的第一个元素,并从字符串中删除与它相等的所有其他元素。然后对第二个字符做同样的事情。
即——“Heello”会变成“Helo”和“Chocolate”“Chlate”
我最初的尝试
removeSuccessor :: String -> String
removeSuccessor x = [c | c <- x, x ! `elem` c]
但这似乎不起作用..建议?
您可以保留一组所有元素,如果尚未看到,则仅保留当前元素:
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)
,我想。
或者您可以使用nub
from Data.List
:
Prelude Data.List> import Data.List
Prelude Data.List> nub "Heello"
"Helo"
Prelude Data.List> nub "Chocolate"
"Choclate"
运行时间为O(n^2)
.