C# - 查找字符串中字母的所有排列,并重复一些字母

时间:2011-09-23 17:07:38

标签: generics c#-4.0 permutation

我在计算包含多个字母实例的字符串的排列时遇到问题(例如“HRWSOROE”,其中'O'和'R'在字符串中两次。我正在使用的算法

public static class Extensions
{
    public static IEnumerable<IEnumerable<T>> Permutations<T>(this IEnumerable<T> source)
    {
        if (source == null) throw new ArgumentNullException("source");
        return PermutationsImpl(source, Enumerable.Empty<T>());
    }

    private static IEnumerable<IEnumerable<T>> PermutationsImpl<T>(IEnumerable<T> source, IEnumerable<T> prefix)
    {
        if (!source.Any()) yield return prefix;
        foreach (var permutation in source.SelectMany(x => PermutationsImpl(source.Except(Yield(x)), prefix.Union(Yield(x)))))
            yield return permutation;
    }

    private static IEnumerable<T> Yield<T>(this T element)
    {
        yield return element;
    }
}

似乎工作,但忽略了重复的字母 - 因此,不是计算“HRWSOROE”上的排列,而是在“HRWSOE”上计算排列。如果有人能够回顾我拥有的东西并让我知道他们的想法,我会很感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

这里的问题似乎是来自PermutationsImpl()的LINQ行中的source.Except(Yield(x))部分。

它正在比较和删除源中与“x”中的值匹配的所有值。