我有一组字符:“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);
}
}
}
您当前的代码看起来很简单,但是如果您正在寻找不使用递归的通用方法,您可以尝试这样的方法(坦率地说,它更复杂,但可以在一般情况下使用):
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