0

文字列の最初の要素を取得し、それに等しい他のすべての要素を文字列から削除する関数を構築しようとしています。次に、2 番目の文字についても同じことを行います。

つまり、「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)だと思います。

nubまたは、次から使用できます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 に答える