2010-09-21 48 views
3

我想要一個C#算法,重新排列字符串中的動態長度的字符。無法找到一個,我知道必須有一個。C#算法,重新排列字符串中的字符

該算法必須重新排列元素以形成所有可能組合中的新字符串。

例如, 「貓」 將產生如下:
貓CTA TCA TAC行爲ATC

+0

你查看常見問題解答:因此,例如,可以按如下方式置換一個字符串(被視爲的char個序列)? http://stackoverflow.com/tags/algorithm/faq – 2010-09-21 20:06:28

回答

6

也有我的EvenMoreLinq跳轉到MoreLinq project on Google Code貢獻了運營商。如果您只是對算法的實現感到好奇,您可以看到code for Permutations<T>() here

它們旨在與LINQ很好地融合,並使用延遲和流式評估。排列是一個有趣的排列,因爲生成所有排列是N!操作......對於即使是很小的值N也會變得非常大。根據您生成的排列方式,您可能(或不可能)實際枚舉全部。

您還可以找到其他組合學操作(SubsetsPermutedSubsetsCartesian ProductsRandom SubsetsSlicesPartitions等)在同一代碼庫的算法。

下面介紹如何使用MoreLinq擴展來排列序列。

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