我想要一个C#算法,将字符重新排列在一个动态长度的字符串中。找不到一个,我知道必须有一个。
算法必须重新排列元素以形成所有可能组合的新字符串。
例如,“cat”会产生以下内容:
cat cta tca tac act atc
答案 0 :(得分:10)
这是一个经常被问到的问题。尝试搜索“排列”,你会发现很多关于如何用各种语言做到这一点的好答案。
C#中有一个排列组合算法库:
答案 1 :(得分:6)
我还为EvenMoreLinq
分支中的MoreLinq project on Google Code提供了运算符。如果您只是对如何实现算法感到好奇,可以看到code for Permutations<T>()
here
它们旨在与LINQ很好地融合,并使用延迟和流式评估。排列是一个有趣的排列,因为生成所有排列是一个N!
操作...即使是N
的小值也变得非常大。根据您如何生成排列,您可能(或可能不)实际枚举它们。
您还可以找到其他组合操作的算法(Subsets,PermutedSubsets,Cartesian Products,Random Subsets,Slices,Partitions,等)在相同的代码库中。
以下是使用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;
}