С# Алгоритм, который переупорядочивает символы в строке

Мне нужен алгоритм С#, который повторно упорядочивает символы в строковой динамической длине. У меня проблемы с поиском, и я знаю, что там должен быть один.

Алгоритм должен перестраивать элементы для формирования новых строк во всех возможных комбинациях.

Например, "cat" будет производить следующее:
cat cta tca tac act atc

Ответ 1

Здесь довольно часто задаваемый вопрос. Попробуйте выполнить поиск по "перестановке", и вы найдете много хороших ответов о том, как это сделать на разных языках.

В С# имеется библиотека алгоритмов перестановок и комбинаций:

http://www.codeproject.com/KB/recipes/Combinatorics.aspx

Ответ 2

Есть также операторы, которые я внес в проект MoreLinq в Google Code в ветке EvenMoreLinq. Если вам просто интересно, как алгоритм реализован, вы можете увидеть код для Permutations<T>() здесь.

Они разработаны, чтобы хорошо сочетаться с LINQ, и используют как отложенную, так и поточную оценку. Перестановки интересны, так как генерация всех перестановок является операцией N!... которая становится очень большой даже при небольших значениях N. В зависимости от того, как вы создаете перестановки, вы можете (или не можете) фактически перечислить их все.

Вы также найдете алгоритмы для других комбинаторных операций (Subsets, PermutedSubsets, Декартовы продукты, Случайные подмножества, фрагменты, Разделы и т.д.) в той же кодовой базе.

Здесь вы можете использовать расширения MoreLinq для перестановки последовательности. Например, вы можете переставить строку (которая рассматривается как последовательность char s) следующим образом:

using MoreLinq;

string input = "cat";
var permutations = input.Permutations();

foreach( var permutation in permutations )
{
    // 'permutation' is a char[] here, so convert back to a string
    Console.WriteLine( new string(permutation) ); 
}

Ответ 3

static void Main(string[] args)
{
    Console.WriteLine("Enter String:");
    string inputString = Console.ReadLine();
    Console.WriteLine();
    List<string> lstAnagrams = new List<string>();
    int numAnagram = 1;

    permute(inputString.ToCharArray(), 0, inputString.Length - 1, lstAnagrams);
    foreach(string anagram in lstAnagrams)
    {
        Console.WriteLine(numAnagram.ToString() + " " + anagram);
        numAnagram++;
    }

    Console.ReadKey();
}

static void permute(char[] word, int start, int end, List<string> lstAnagrams)
{
    if (start == end)
        lstAnagrams.Add(string.Join("", word));
    else
    {
        for (int position = start; position <= end; position++)
        {
            swap(ref word[start], ref word[position]);
            permute(word, start + 1, end,lstAnagrams);
            swap(ref word[start], ref word[position]);
        }
    }
}

static void swap(ref char a, ref char b)
{
    char tmp;
    tmp = a;
    a = b;
    b = tmp;
}