检查第一个参数中的所有元素是否出现在第二个参数中

时间:2019-11-08 13:25:15

标签: haskell

我从代码中得到了错误的结果。

我想检查第一个参数列表中的元素是否出现在第二个参数列表中,并且我使用了此停顿Check, if list is a sublist of another list中的代码,但没有得到想要的结果。

del :: Eq t => [t] -> [t] -> Bool
del [] [] = True 
del _ []  = False 
del [] _  = True
del (x:xs) (y:ys)
    | x == y    = del xs ys
    | otherwise = del (x:xs) ys
del [2,3] [3,3,1]  -- should return False, which it does, but 
del "cbbbc" "bca"  -- should return True, but instead it returns False

我不明白为什么?

2 个答案:

答案 0 :(得分:3)

"cbbbc"不是"bca"的子列表,这意味着列表"cbbbc"不会像"bca"那样出现在"ca"内部。您的问题是另一个问题。这是一个工作代码,时间复杂度为O(n):

del :: Eq a => [a] -> [a] -> Bool
del xs ys = all (`elem` ys) xs

这意味着:如果(且仅当),对于True中的每个xxsx的元素,返回ys

答案 1 :(得分:2)

您即将移除y;仅仅因为x /= y并不意味着x == z对于z中的某些其他值ys不会成立。如果您不需要在 all 处删除elem,则使用y实施起来会容易得多。如果这样做,找到匹配项时,您将需要做更多的工作才能从ys中删除正确的元素。 (例如,del [1, 1] [1]应该返回True还是False,因为1在第二个列表中不会出现两次?)