C # - Поиск всех перестановок букв в строке с повторением некоторых букв - PullRequest
1 голос
/ 23 сентября 2011

У меня проблемы с вычислением перестановок для строк, содержащих несколько экземпляров буквы (например, «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 Ответ

2 голосов
/ 23 сентября 2011

Кажется, что проблема здесь в части source.Except (Yield (x)) в строке LINQ в PermutationsImpl ().

Он сравнивает и удаляет все значения в источнике, которые соответствуют значениям в 'x'.

...