2017-02-21 27 views
2

Я изо всех сил пытаюсь понять всю неполную информацию, которую я нашел о своем вопросе, поэтому я надеюсь, что вы можете мне помочь. Я хочу написать программу, которая печатает все возможные комбинации строки. Для примера:Как распечатать все возможные комбинации нескольких символов?

Дано выражение ABC * 2, программа будет печатать:

  • A; B; C
  • AA; BB; CC; AB; AC; ДО НАШЕЙ ЭРЫ; BA; CA; CB
  • AAA; В; CCC; AAB; AAC; ABB; ABC ... и так далее. * 1

Какие алгоритмы я должен использовать? Я на самом деле новичок в программировании, и я действительно пытаюсь понять логику алгоритма перестановок, но я действительно задумался о создании этой программы.

Спасибо.

* 1 Это печатает все три буквенные комбинации букв a, b и c в любом порядке, если они отличаются от всех предыдущих записей.

* 2 Если строка AAB, то результатом будет все комбинации A и B, но с тремя ограничениями символов.

+0

Вы должны прояснить 'и так далее' части. Без максимального размера существует неограниченное количество комбинаций. –

+0

@huck_cussler, на мой взгляд, сейчас я хочу получить основную логику программы, поэтому она ограничена длиной ABC, но в будущем я хотел бы добавить реализацию, например, для печати всех комбинаций с ограничением длины , – user264307

+0

Что вы будете делать, если ввод «AAB»? – stark

ответ

0

Разделите проблему на две части: сначала попробуйте получить все перестановки при предоставлении ее size и alphabet с различными символами, например. C# код может быть:

private static IEnumerable<string> Permutations(int size, string alphabet) { 
    StringBuilder word = new StringBuilder(new string(alphabet[0], size)); 

    while (true) { 
    string result = word.ToString(); 

    yield return result; 

    if (result.All(c => c == alphabet[alphabet.Length - 1])) 
     break; 

    for (int i = word.Length - 1; i >= 0; --i) 
     if (result[i] == alphabet[alphabet.Length - 1]) 
     word[i] = alphabet[0]; 
     else { 
     word[i] = alphabet[alphabet.IndexOf(word[i]) + 1]; 

     break; 
     } 
    } 
} 

Тест:

// AA, AB, AC, BA, BB, BC, CA, CB, CC 
Console.Write(string.Join(", ", Permutations(2, "ABC"))); 

Тогда объединить перестановки различных size с в случае C# implmentation это можно сделать легко с помощью Linq:

string alphabet = "ABA"; 
int limit = alphabet.Length; //TODO: it's unclear what limit is, put the right one 
string distinctAlphabet = string.Concat(alphabet.OrderBy(c => c).Distinct()); 

var result = Enumerable.Range(1, limit) 
    .Select(length => string.Join("; ", Permutations(length, distinctAlphabet))); 

Console.Write(string.Join(Environment.NewLine, result)); 

Выход (для source = "ABC";):

A; B; C 
AA; AB; AC; BA; BB; BC; CA; CB; CC 
AAA; AAB; AAC; ABA; ABB; ABC; ... ; CBB; CBC; CCA; CCB; CCC 

выход (для source = "ABA";):

A; B 
AA; AB; BA; BB 
AAA; AAB; ABA; ABB; BAA; BAB; BBA; BBB