【发布时间】:2012-03-09 13:48:10
【问题描述】:
我目前正在从事一个项目,我需要从给定的字符集生成所有可能的排列。我目前正在使用此代码:
public static IEnumerable<string> AllPermutations(this IEnumerable<char> s)
{
return s.SelectMany(x =>
{
var index = Array.IndexOf(s.ToArray(), x);
return s.Where((y, i) => i != index).AllPermutations().Select(y => new string(new[] { x }.Concat(y).ToArray())).Union(new[] { new string(new[] { x }) });
}).Distinct();
}
来自this 的回答。
我遇到的问题是它不会生成多次使用相同字母的排列。
例如,如果我使用abcde 作为输入,我需要它来生成aaaaa 和dcc 等组合。
我对 LINQ 的经验不足,无法理解代码在何处停止重复字母。非常感谢任何帮助。
【问题讨论】:
-
是否有理由在 LINQ 中这样做?
-
我没有写这个,所以只是在寻找真正能完成这项工作的代码。
-
'aaaaa' 不是 'abcde' 的排列。如果您的项目需要排列,请不要包含“aaaaa”,如果您包含“aaaaa”,请不要将其称为排列(或就此而言的组合)。你只会混淆阅读你问题的每个人,包括你自己。
-
也许你需要的是不断重复的变化。
-
我还需要任何较短的版本,从 1 个字符到字符串长度,以任意顺序使用所有输入字母。
标签: c# algorithm permutation