一尘不染

计算给定长度(C#)的所有可能的子序列

algorithm

如果我的序列如下(假设是IEnumerable<T>):

[A, B, C, D, E]

那么,计算给定长度的所有可能(连续和非连续)子序列的最干净方法是什么?结果在结果集中的排序并不重要,但不应包含重复项。

例如,如果我想计算长度3的所有可能的子序列,则结果集将是:

[A, B, C]
[A, B, D]
[A, B, E]
[A, C, D]
[A, C, E]
[A, D, E]
[B, C, D]
[B, C, E]
[B, D, E]
[C, D, E]

记录下来,下面可接受的答案为我提供了一个很好的起点,这是我处理的代码已更新为使用某些新的.NET 3.5扩展方法:

public static IEnumerable<IEnumerable<T>> Subsequences<T>(
    this IEnumerable<T> source, 
    int count)
{
    if (count == 0)
    {
        yield return Enumerable.Empty<T>();
    }
    else
    {
        var skip = 1;
        foreach (var first in source)
        {
            foreach (var rest in source.Skip(skip).Subsequences(count - 1))
            {
                yield return Enumerable.Repeat(first, 1).Concat(rest);
            }

            skip++;
        }
    }
}

阅读 200

收藏
2020-07-28

共1个答案

一尘不染

我在IanG的PermuteUtils课程中取得了成功:

char[] items = new char[] { 'A', 'B', 'C', 'D', 'E' };

foreach (IEnumerable<char> permutation in PermuteUtils.Permute(items, 3)) {
    Console.Write("[");
    foreach (char c in permutation) {
        Console.Write(" " + c);
    }
    Console.WriteLine(" ]");
}

结果是:

[ABC]
[ABD]
[ABE]
[ACB]
[ACD]
[ACE]
[亚行]
[ADC]
[ADE]
[AEB]
[AEC]
[AED]
[BAC]
[坏]
[BAE]
[BCA]
[BCD]
[BCE]
[BDA]
[BDC]
...
2020-07-28