Это сгенерирует набор, который вы хотите, но в другом порядке (в конце я сортирую по алфавиту, вам также нужно отсортировать по длине).
Вы получите:
а
аб
азбука
ABCD
ABCDE
ABCE
...
d
де
е
Итак, каждое возможное подмножество (кроме пустой строки) при сохранении порядка исходного списка.
Идея состоит в том, чтобы добавить каждый элемент в растущий список. С каждым новым элементом сначала добавьте его, а затем добавьте его ко всем существующим элементам.
Итак, начните с «а».
Перейти к «б». Добавьте это в список. Теперь у нас есть {'a', 'b'}.
Добавьте его к существующим элементам, чтобы у нас было 'ab'. Теперь у нас есть {'a', 'b', 'ab'}.
Затем 'c' и добавьте его к существующим элементам, чтобы получить 'ac', 'bc', 'abc': {'a', 'b', 'ab', 'c', 'ac', ' bc ', abc'}. И так до тех пор, пока мы не закончим.
string set = "abcde";
// Init list
List<string> subsets = new List<string>();
// Loop over individual elements
for (int i = 1; i < set.Length; i++)
{
subsets.Add(set[i - 1].ToString());
List<string> newSubsets = new List<string>();
// Loop over existing subsets
for (int j = 0; j < subsets.Count; j++)
{
string newSubset = subsets[j] + set[i];
newSubsets.Add(newSubset);
}
subsets.AddRange(newSubsets);
}
// Add in the last element
subsets.Add(set[set.Length - 1].ToString());
subsets.Sort();
Console.WriteLine(string.Join(Environment.NewLine, subsets));