C#重新排列字符串中的字符的算法

时间:2010-09-21 17:49:38

标签: c# algorithm string permutation

我想要一个C#算法,将字符重新排列在一个动态长度的字符串中。找不到一个,我知道必须有一个。

算法必须重新排列元素以形成所有可能组合的新字符串。

例如,“cat”会产生以下内容:
cat cta tca tac act atc

3 个答案:

答案 0 :(得分:10)

这是一个经常被问到的问题。尝试搜索“排列”,你会发现很多关于如何用各种语言做到这一点的好答案。

C#中有一个排列组合算法库:

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

答案 1 :(得分:6)

我还为EvenMoreLinq分支中的MoreLinq project on Google Code提供了运算符。如果您只是对如何实现算法感到好奇,可以看到code for Permutations<T>() here

它们旨在与LINQ很好地融合,并使用延迟和流式评估。排列是一个有趣的排列,因为生成所有排列是一个N!操作...即使是N的小值也变得非常大。根据您如何生成排列,您可能(或可能不)实际枚举它们。

您还可以找到其他组合操作的算法(SubsetsPermutedSubsetsCartesian ProductsRandom SubsetsSlicesPartitions,等)在相同的代码库中。

以下是使用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) ); 
}

答案 2 :(得分:-1)

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;
}