My solution would be as follows:
ClearAll[ContainsAllMultiplicities]
ContainsAllMultiplicities[l1_List, l2_List] :=
Module[{c1, c2, m, il1, il2},
c1 = {1, #} & /@ Counts[l1];
c2 = {2, #} & /@ Counts[l2];
m = Merge[{c1, c2}, Identity];
m = Values[m];
If[MemberQ[m, {{2, _}}],
False
,
m = DeleteCases[m, {{1, _}}];
m = SortBy[First] /@ m;
m = m[[All, All, 2]];
AllTrue[m, GreaterEqual @@ # &]
]
]
Some test code:
ContainsAllMultiplicities[{a, b, c}, {c, b}]
ContainsAllMultiplicities[{a, b, c}, {c, c}]
ContainsAllMultiplicities[{a, b, c}, {c, c, d}]
ContainsAllMultiplicities[{a, b, c, c}, {c, a, c}]
ContainsAllMultiplicities[{a, b, c, c}, {c, a, c, b}]
ContainsAllMultiplicities[{a, b, c, c}, {c, a, c, b, c}]
returning:
True
False
False
True
True
False
Should work fast, especially for large listsÂ…