c# 中给定长度的一组字符的所有组合和排列

问题描述 投票:0回答:1

我有一组字符:“ab”,我需要它的每个组合和排列到给定的长度。 如果我给出的长度为 3,我需要这样的集合: A, 乙、 啊, ab, 巴, BB, 啊啊, 阿布, 阿坝、 阿布, 咩, 巴巴, 工商管理硕士, bb

等等。

我找到了一种很好的解决方案(https://stackoverflow.com/a/3640224/18535919),但我认为它有点复杂。我过去找到了一个很好的解决方案,但我再也找不到了。

static int maxlength = 3;
static string ValidChars = "abc";
static void Dive(string prefix, int level)
{
       level += 1;
       foreach (char c in ValidChars)
       {
            Console.WriteLine(prefix + c);
            if (level < maxlength)
            {
                Dive(prefix + c, level);
            }
      }
}
c# string combinations permutation
1个回答
0
投票

您当前的代码看起来很简单,但是如果您正在寻找不使用递归的通用方法,您可以尝试这样的方法(坦率地说,它更复杂,但可以在一般情况下使用):

小提琴

using System.Linq;

...

private static IEnumerable<T[]> SolveMe<T>(int maxLength, IEnumerable<T> chars) {
  if (maxLength < 0)
    throw new ArgumentOutOfRangeException(nameof(maxLength));

  if (chars is null)
    throw new ArgumentNullException(nameof(chars));

  var letters = chars.Distinct().ToArray();

  if (letters.Length == 0)
     yield break;

  for (var agenda = new Queue<T[]>(new[] { Array.Empty<T>() }); 
           agenda.Peek().Length < maxLength;) {
    var current = agenda.Dequeue();

    foreach (var letter in letters) {
      var next = current.Append(letter).ToArray();

      agenda.Enqueue(next);

      yield return next;
    }
  }
}

演示:

// All solutions as a list
List<char[]> result = SolveMe(3, "ab").ToList();

var report = string.Join(", ", result.Select(item => string.Concat(item)));

Console.Write(report);

输出:

a, b, aa, ab, ba, bb, aaa, aab, aba, abb, baa, bab, bba, bbb
© www.soinside.com 2019 - 2024. All rights reserved.