我想要一個C#算法,重新排列字符串中的動態長度的字符。無法找到一個,我知道必須有一個。C#算法,重新排列字符串中的字符
該算法必須重新排列元素以形成所有可能組合中的新字符串。
例如, 「貓」 將產生如下:
貓CTA TCA TAC行爲ATC
我想要一個C#算法,重新排列字符串中的動態長度的字符。無法找到一個,我知道必須有一個。C#算法,重新排列字符串中的字符
該算法必須重新排列元素以形成所有可能組合中的新字符串。
例如, 「貓」 將產生如下:
貓CTA TCA TAC行爲ATC
這是一個相當常見的問題在這裏。嘗試搜索「排列組合」,你會發現許多關於如何以各種語言做到這一點的良好答案。
還有就是排列組合的算法在C#這裏的圖書:
也有我的EvenMoreLinq
跳轉到MoreLinq project on Google Code貢獻了運營商。如果您只是對算法的實現感到好奇,您可以看到code for Permutations<T>()
here。
它們旨在與LINQ很好地融合,並使用延遲和流式評估。排列是一個有趣的排列,因爲生成所有排列是N!
操作......對於即使是很小的值N
也會變得非常大。根據您生成的排列方式,您可能(或不可能)實際枚舉全部。
您還可以找到其他組合學操作(Subsets,PermutedSubsets,Cartesian Products,Random Subsets,Slices,Partitions等)在同一代碼庫的算法。
下面介紹如何使用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));
}
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;
}
你查看常見問題解答:因此,例如,可以按如下方式置換一個字符串(被視爲的
char
個序列)? http://stackoverflow.com/tags/algorithm/faq – 2010-09-21 20:06:28