gpt4 book ai didi

c# - 使用相同字母的排列

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:16:24 25 4
gpt4 key购买 nike

我目前正在做一个项目,我需要从给定的一组字符中生成所有可能的排列。我目前正在使用此代码:

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 作为输入,我需要它来生成像 aaaaadcc 等组合

我对 LINQ 的经验不足,无法理解代码在何处停止重复字母。非常感谢任何帮助。

最佳答案

可能有效,但我确信它可以更有效地完成(从 PeskyGnat 获取计数提示):

    static IEnumerable<string> GetVariations(string s)
{
int[] indexes = new int[s.Length];
StringBuilder sb = new StringBuilder();

while (IncrementIndexes(indexes, s.Length))
{
sb.Clear();
for (int i = 0; i < indexes.Length; i++)
{
if (indexes[i] != 0)
{
sb.Append(s[indexes[i]-1]);
}
}
yield return sb.ToString();
}
}

static bool IncrementIndexes(int[] indexes, int limit)
{
for (int i = 0; i < indexes.Length; i++)
{
indexes[i]++;
if (indexes[i] > limit)
{
indexes[i] = 1;
}
else
{
return true;
}
}
return false;
}

编辑:根据 Rawlings 的建议更改为使用 yield 返回。如果您不需要保留所有结果并且可以在结果全部生成之前就开始使用它们,那么内存使用会好得多。

关于c# - 使用相同字母的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9635076/

25 4 0
文章推荐: java - 定制设计算法的好处
文章推荐: List 和 List 之间的 Java 区别