Я знаю, что у вас уже есть очень хороший ответ (на самом деле несколько), но я немного подумал об этой проблеме и придумал довольно аккуратный алгоритм, которым я мог бы поделиться.
По сути, вы можете сделать это, начав со списка символов, а затем добавив каждый символ к каждому символу, чтобы создать два слова символа, а затем добавив каждый символ к каждому слову. Это может не иметь особого смысла, вот как это выглядит:
Начните с символов 'a', 'b' и 'c' и добавьте их в список:
a
b
c
Добавьте «a», «b» и «c» к каждому слову в списке. Список выглядит так:
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
Затем добавьте «a», «b» и «c» к каждому новому слову в списке, чтобы список выглядел так:
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
aaa
aab
aac
aba
abb
... and so on
Вы можете легко сделать это с помощью итератора и просто позволить итератору продолжать работу с самого начала.
Этот код печатает каждое слово, добавленное в список.
void permutations(string symbols)
{
list<string> l;
// add each symbol to the list
for (int i = 0; i < symbols.length(); i++)
{
l.push_back(symbols.substr(i, 1));
cout << symbols.substr(i, 1) << endl;
}
// infinite loop that looks at each word in the list
for (list<string>::iterator it = l.begin(); it != l.end(); it++)
{
// append each symbol to the current word and add it to the end of the list
for (int i = 0; i < symbols.length(); i++)
{
string s(*it);
s.push_back(symbols[i]);
l.push_back(s);
cout << s << endl;
}
}
}