2

アップデート:

@Blender が Python で指摘したようにset('aab').issubset(set('abb')) == True。私の状況では、これは false を返す必要があります。各文字の数を考慮する必要があります。


基本的に、2 つの文字列があり、一方が他方のサブセットであるかどうかを判断したいと考えています。例:

String A: abcd
String B: dbace
String A is a subset of string B

文字は任意の順序にすることができ、複数の文字を繰り返すことができます。文字列を並べ替えてから String.StartsWith を使用しようとしましたが、これは特定の状況では機能しません。例:

String A: abcdd
string B: abbcdd
Ordering these and using StartsWith returns false because string B has two "b"s

私は周りを見回して、Pythonの issubset メソッドを見つけました。これは私が望むことをしているように見えます.

注: アナグラムではなく、サブセットを探しています。

4

2 に答える 2

6

あなたが望むように動作することを私が知っている組み込みは何もありません。厳密に言えば、これは実際のサブセットではありません。Python のようにセットの比較を行う必要があるためです (セット内のすべてのアイテムが一意である) が、1 つを調理するのは簡単なはずです。

public static bool IsSubsetOf<TSource>(this IEnumerable<TSource> lhs, IEnumerable<TSource> rhs)
{
    // O(m+n)
    var contents = rhs.ToList();
    foreach (var item in lhs)
    {
        if (!contents.Remove(item))
            return false;
    }
    return true;
}
"aab".IsSubsetOf("abb");      // false
"foo".IsSubsetOf("food");     // true
"foo".IsSubsetOf("goof");     // true
"bar".IsSubsetOf("barf");     // true
"abcd".IsSubsetOf("dbace");   // true
"abcdd".IsSubsetOf("abbcdd"); // true

真のセットのメカニズムが必要な場合は、同じくらい簡単です。

public static bool IsTrueSubsetOf<TSource>(this IEnumerable<TSource> lhs, IEnumerable<TSource> rhs)
{
    return new HashSet<TSource>(lhs).IsSubsetOf(rhs);
}
于 2012-05-19T05:21:45.340 に答える
-1

最善の解決策は、両方を並べ替えて、Containsメソッドごとにサブセットを確認することだと思います。

new String(A.OrderBy(o=> o)).Contains(new String(B.OrderBy(o=>o)))

アップデート:

new String(A.OrderBy(o=> o)
            .Distinct())
     .Contains(new String(B.OrderBy(o=>o)
                           .Distinct()))
于 2012-05-19T05:24:14.907 に答える