using System.Collections.Generic;
public static void SetCombinationsWithAStack(List<char> words, int take, HashSet<string> uniques)
List<char> visited = [], remaining;
if (visited.Count >= take)
uniques.Add(string.Join(' ', visited.Order()));
remaining = [..words.Where((_, index) => index != i)];
remaining.ForEach(remainingItem => stack.Push(remainingItem));
public static void SetCombinations(List<char> words, int take, List<char> visited, HashSet<string> uniques)
if (visited.Count >= take)
uniques.Add(string.Join(' ', visited.Order()));
for (int i = 0, l = words.Count; i < l; i++)
remaining = [..words.Where((_, index) => index != i)];
SetCombinations(remaining, take, visited, uniques);
visited.Remove(words[i]);
public static void TestCombinations(string word, int take)
var uniques = new HashSet<string>();
SetCombinations(word.ToList(), take, [], uniques);
Console.Write(string.Join('\n', uniques));
public static void TestCombinationsWithAStack(string word, int take)
var uniques = new HashSet<string>();
SetCombinationsWithAStack(word.ToList(), take, uniques);
Console.Write(string.Join('\n', uniques));
public static void Main()
TestCombinations(word, take);
TestCombinationsWithAStack(word, take);