static IEnumerable<IReadOnlyList<int>> GetCombinationsImplem(Stack<int> inStack, Stack<int> outStack)
{
// recursion end point
if (inStack.Count is 0)
{
yield return outStack.ToArray();
yield break;
}
var digit1 = inStack.Pop();
// Try put one digit from in to out
if (digit1 is >= 1 and <= 26)
{
outStack.Push(digit1);
foreach (var combinaison in GetCombinationsImplem(inStack, outStack))
{
yield return combinaison;
}
outStack.Pop();
}
// Try put two combined digit (ex: 1,2 => 12) from in to out
// First, test for the presence of a digit
if (inStack.TryPop(out var digit2))
{
var v = digit1 + 10 * digit2;
// Continue only if the value is acceptable
if (v is >= 1 and <= 26)
{
outStack.Push(v);
foreach (var combinaison in GetCombinationsImplem(inStack, outStack))
{
yield return combinaison;
}
// restore outStack
outStack.Pop();
}
// restore inStack
inStack.Push(digit2);
}
// restore inStack
inStack.Push(digit1);
}
1条答案
按热度按时间rjee0c151#
获得所有可能组合的一种方法是在递归算法中使用两个堆栈
inStack
和outStack
,其中验证单个或成对的数字。第一个
inStack
由输入的数字位数填充,而outStack
为空。然后调用这个递归算法:
inStack
为空,则返回outStack
的内容。inStack
的第一个元素有效(非0)inStack
中删除并放入outStack
中inStack
的前两个元素组合为有效值inStack
中移除,并将它们合并到outStack
中512
的调用日志如下所示(栈头位于右侧):请注意,
inStack
和outStack
的内容是相反的,必须在某个点执行Reverse
调用。实现将如下所示:
从这个到字母的转换是一个琐事
(char)('a' + digit - 1)
将1转换为a
,2转换为b
,等等...不需要字典。工作代码可用here。
在线演示可用here。